Skip to main content

simconnect_sdk/simconnect/
events.rs

1use crate::{
2    bindings, success, ClientEventRequest, SimConnect, SimConnectError, SystemEventRequest,
3};
4
5// In order to simplify the usage we're using a single notification group for all client events.
6const NOTIFICATION_GROUP_ID: u32 = 0;
7
8impl SimConnect {
9    /// Request that a specific system event is notified.
10    #[tracing::instrument(
11        name = "SimConnect::subscribe_to_system_event",
12        level = "debug",
13        skip(self)
14    )]
15    pub fn subscribe_to_system_event(
16        &mut self,
17        event: SystemEventRequest,
18    ) -> Result<(), SimConnectError> {
19        self.system_event_register.register(event)?;
20
21        success!(unsafe {
22            bindings::SimConnect_SubscribeToSystemEvent(
23                self.handle.as_ptr(),
24                event as u32,
25                event.into_c_char(),
26            )
27        })?;
28
29        Ok(())
30    }
31
32    /// Request that notifications are no longer received for the specified system event.
33    /// If the system event is not subscribed to, this function does nothing.
34    #[tracing::instrument(
35        name = "SimConnect::unsubscribe_from_system_event",
36        level = "debug",
37        skip(self)
38    )]
39    pub fn unsubscribe_from_system_event(
40        &mut self,
41        event: SystemEventRequest,
42    ) -> Result<(), SimConnectError> {
43        if self.system_event_register.is_registered(event) {
44            success!(unsafe {
45                bindings::SimConnect_UnsubscribeFromSystemEvent(self.handle.as_ptr(), event as u32)
46            })?;
47
48            self.system_event_register.clear();
49        }
50
51        Ok(())
52    }
53
54    /// Request that a specific client event is notified.
55    #[tracing::instrument(
56        name = "SimConnect::subscribe_to_client_event",
57        level = "debug",
58        skip(self)
59    )]
60    pub fn subscribe_to_client_event(
61        &mut self,
62        event: ClientEventRequest,
63    ) -> Result<(), SimConnectError> {
64        self.client_event_register.register(event)?;
65
66        success!(unsafe {
67            bindings::SimConnect_MapClientEventToSimEvent(
68                self.handle.as_ptr(),
69                event as u32,
70                event.into_c_char(),
71            )
72        })?;
73
74        success!(unsafe {
75            bindings::SimConnect_AddClientEventToNotificationGroup(
76                self.handle.as_ptr(),
77                NOTIFICATION_GROUP_ID,
78                event as u32,
79                0,
80            )
81        })?;
82
83        success!(unsafe {
84            bindings::SimConnect_SetNotificationGroupPriority(
85                self.handle.as_ptr(),
86                NOTIFICATION_GROUP_ID,
87                bindings::SIMCONNECT_GROUP_PRIORITY_HIGHEST,
88            )
89        })?;
90
91        Ok(())
92    }
93
94    /// Request that notifications are no longer received for the specified client event.
95    /// If the client event is not subscribed to, this function does nothing.
96    #[tracing::instrument(
97        name = "SimConnect::unsubscribe_from_client_event",
98        level = "debug",
99        skip(self)
100    )]
101    pub fn unsubscribe_from_client_event(
102        &mut self,
103        event: ClientEventRequest,
104    ) -> Result<(), SimConnectError> {
105        if self.client_event_register.is_registered(event) {
106            success!(unsafe {
107                bindings::SimConnect_RemoveClientEvent(
108                    self.handle.as_ptr(),
109                    NOTIFICATION_GROUP_ID,
110                    event as u32,
111                )
112            })?;
113
114            self.client_event_register.unregister(event)?;
115        }
116
117        Ok(())
118    }
119
120    /// Request that notifications are no longer received for any client event.
121    #[tracing::instrument(
122        name = "SimConnect::unsubscribe_from_all_client_events",
123        level = "debug",
124        skip(self)
125    )]
126    pub fn unsubscribe_from_all_client_events(&mut self) -> Result<(), SimConnectError> {
127        success!(unsafe {
128            bindings::SimConnect_ClearNotificationGroup(self.handle.as_ptr(), NOTIFICATION_GROUP_ID)
129        })?;
130
131        self.client_event_register.clear();
132
133        Ok(())
134    }
135}