From 49192dbb98e0ab1f2a66b4786fac86d63f69be64 Mon Sep 17 00:00:00 2001 From: "1992414357@qq.com" <1992414357@qq.com> Date: Mon, 9 Jun 2025 01:44:36 +0800 Subject: 重构所有部分 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- core/src/data/controller/cli/cli_command.rs | 48 ++++++++++++++++++++++++++ core/src/data/controller/cli/mod.rs | 1 + core/src/data/controller/implements.rs | 21 +++++++++++ core/src/data/controller/mod.rs | 4 +++ core/src/data/controller/runtime/implements.rs | 29 ++++++++++++++++ core/src/data/controller/runtime/mod.rs | 2 ++ core/src/data/controller/runtime/structs.rs | 20 +++++++++++ core/src/data/controller/structs.rs | 10 ++++++ 8 files changed, 135 insertions(+) create mode 100644 core/src/data/controller/cli/cli_command.rs create mode 100644 core/src/data/controller/cli/mod.rs create mode 100644 core/src/data/controller/implements.rs create mode 100644 core/src/data/controller/mod.rs create mode 100644 core/src/data/controller/runtime/implements.rs create mode 100644 core/src/data/controller/runtime/mod.rs create mode 100644 core/src/data/controller/runtime/structs.rs create mode 100644 core/src/data/controller/structs.rs (limited to 'core/src/data/controller') diff --git a/core/src/data/controller/cli/cli_command.rs b/core/src/data/controller/cli/cli_command.rs new file mode 100644 index 0000000..b5c0414 --- /dev/null +++ b/core/src/data/controller/cli/cli_command.rs @@ -0,0 +1,48 @@ +use std::sync::{Arc, Mutex}; +use clap::{Parser, Subcommand}; +use nogamepads::entry_mutex; +use crate::data::controller::runtime::structs::ControllerRuntime; +use crate::data::message::enums::ControlMessage; +use crate::data::message::traits::MessageManager; +use crate::service::service_types::ServiceType::TCPConnection; + +#[derive(Parser, Debug)] +#[command(author, version, about, long_about = None)] +pub struct ControllerCli { + #[command(subcommand)] + command: Commands, +} + +#[derive(Subcommand, Debug)] +enum Commands { + + #[command(about = "Clean the screen")] + Clear, + + #[command(about = "Send a message")] + Message, + + #[command(about = "Close the controller")] + Close +} + +pub fn process_controller_cli(runtime: Arc>, cmd: ControllerCli) { + + match cmd.command { + Commands::Clear => { + + } + + Commands::Message => { + entry_mutex!(runtime, |guard| { + guard.send(ControlMessage::Msg("fuck".to_string()), 0, TCPConnection); + }); + } + + Commands::Close => { + entry_mutex!(runtime, |guard| { + guard.close(); + }); + } + } +} \ No newline at end of file diff --git a/core/src/data/controller/cli/mod.rs b/core/src/data/controller/cli/mod.rs new file mode 100644 index 0000000..043f7b8 --- /dev/null +++ b/core/src/data/controller/cli/mod.rs @@ -0,0 +1 @@ +pub mod cli_command; \ No newline at end of file diff --git a/core/src/data/controller/implements.rs b/core/src/data/controller/implements.rs new file mode 100644 index 0000000..86a19de --- /dev/null +++ b/core/src/data/controller/implements.rs @@ -0,0 +1,21 @@ +use std::sync::{Arc, Mutex}; +use crate::data::controller::runtime::structs::ControllerRuntime; +use crate::data::controller::structs::ControllerData; +use crate::data::player::structs::Player; + +impl ControllerData { + + pub fn bind_player(&mut self, player: Player) -> &mut ControllerData { + self.player = player; + self + } + + /// Build the controller-side runtime using controller data + pub fn runtime(self) -> Arc> { + let runtime = ControllerRuntime { + player: self.player, + ..Default::default() + }; + Arc::new(Mutex::new(runtime)) + } +} \ No newline at end of file diff --git a/core/src/data/controller/mod.rs b/core/src/data/controller/mod.rs new file mode 100644 index 0000000..019ebcf --- /dev/null +++ b/core/src/data/controller/mod.rs @@ -0,0 +1,4 @@ +pub mod cli; +pub mod runtime; +pub mod implements; +pub mod structs; \ No newline at end of file diff --git a/core/src/data/controller/runtime/implements.rs b/core/src/data/controller/runtime/implements.rs new file mode 100644 index 0000000..b79890e --- /dev/null +++ b/core/src/data/controller/runtime/implements.rs @@ -0,0 +1,29 @@ +use std::collections::{HashMap, VecDeque}; +use std::sync::atomic::Ordering::SeqCst; +use log::trace; +use crate::data::controller::runtime::structs::ControllerRuntime; +use crate::data::message::enums::{ControlMessage, GameMessage}; +use crate::data::message::traits::MessageManager; +use crate::service::service_types::ServiceType; + +/// Message manager for controller-side runtime +/// After the service starts, it can be accessed or relevant messages can be stored. +impl MessageManager for ControllerRuntime { + fn borrow_received_list_mut(&mut self) -> &mut HashMap<(ServiceType, u8), VecDeque> { + &mut self.received + } + + fn borrow_send_list_mut(&mut self) -> &mut HashMap<(ServiceType, u8), VecDeque> { + &mut self.send + } +} + +impl ControllerRuntime { + + pub fn close(&mut self) { + if !self.close.load(SeqCst) { + self.close.store(true, SeqCst); + trace!("[Controller Runtime] Closed."); + } + } +} \ No newline at end of file diff --git a/core/src/data/controller/runtime/mod.rs b/core/src/data/controller/runtime/mod.rs new file mode 100644 index 0000000..0ff870f --- /dev/null +++ b/core/src/data/controller/runtime/mod.rs @@ -0,0 +1,2 @@ +pub mod implements; +pub mod structs; \ No newline at end of file diff --git a/core/src/data/controller/runtime/structs.rs b/core/src/data/controller/runtime/structs.rs new file mode 100644 index 0000000..7be2cd6 --- /dev/null +++ b/core/src/data/controller/runtime/structs.rs @@ -0,0 +1,20 @@ +use std::collections::{HashMap, VecDeque}; +use std::sync::atomic::AtomicBool; +use crate::data::game::types::GameInfo; +use crate::data::message::enums::{ControlMessage, GameMessage}; +use crate::data::player::structs::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) received: HashMap<(ServiceType, u8), VecDeque>, + pub(crate) send: HashMap<(ServiceType, u8), VecDeque>, + + pub(crate) player: Player, + + pub game_info: GameInfo, + pub close: AtomicBool +} \ No newline at end of file diff --git a/core/src/data/controller/structs.rs b/core/src/data/controller/structs.rs new file mode 100644 index 0000000..c6fdd31 --- /dev/null +++ b/core/src/data/controller/structs.rs @@ -0,0 +1,10 @@ +use crate::data::player::structs::Player; + +/// Controller-side Data +/// Describes the basic information of the controller side +#[derive(Default)] +pub struct ControllerData { + + /// Player bound to the controller side + pub(crate) player: Player +} \ No newline at end of file -- cgit