aboutsummaryrefslogtreecommitdiff
path: root/core/src/data/controller/controller_runtime.rs
blob: 9030fb1fbba28f2171193e3f32d4ae1452229e14 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
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())
    }

    pub fn send_message (&mut self, msg: ControlMessage) {
        let service = self.service_type.clone();
        self.send(msg, 0, service);
    }
}