diff --git a/README.md b/README.md index 5bcb605..bb86434 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ [![CI][ci_badge]][ci] +An opinionated SimConnect SDK that encapsulates the C API fully and optimizes for developer experience. + ## Usage ```toml @@ -15,6 +17,7 @@ use simconnect_sdk::{Notification, SimConnect, SimConnectObject}; /// A data structure that will be used to receive data from SimConnect. #[derive(Debug, Clone, SimConnectObject)] #[simconnect(period = "second")] +#[allow(dead_code)] struct GpsData { #[simconnect(name = "PLANE LATITUDE", unit = "degrees")] lat: f64, @@ -25,7 +28,7 @@ struct GpsData { } fn main() -> Result<(), Box> { - let client = SimConnect::new("Simple Program"); + let client = SimConnect::new("Receiving data example"); match client { Ok(mut client) => { diff --git a/examples/src/data.rs b/examples/src/data.rs index 0536a79..9472247 100644 --- a/examples/src/data.rs +++ b/examples/src/data.rs @@ -1,10 +1,9 @@ -#![allow(dead_code)] - use simconnect_sdk::{Notification, SimConnect, SimConnectObject}; /// A data structure that will be used to receive data from SimConnect. #[derive(Debug, Clone, SimConnectObject)] #[simconnect(period = "second")] +#[allow(dead_code)] struct GpsData { #[simconnect(name = "PLANE LATITUDE", unit = "degrees")] lat: f64, @@ -15,7 +14,7 @@ struct GpsData { } fn main() -> Result<(), Box> { - let client = SimConnect::new("Simple Program"); + let client = SimConnect::new("Receiving data example"); match client { Ok(mut client) => { diff --git a/examples/src/data_multiple_objects.rs b/examples/src/data_multiple_objects.rs index 9d4c326..e26a565 100644 --- a/examples/src/data_multiple_objects.rs +++ b/examples/src/data_multiple_objects.rs @@ -1,10 +1,9 @@ -#![allow(dead_code)] - use simconnect_sdk::{Notification, SimConnect, SimConnectObject}; /// A data structure that will be used to receive data from SimConnect. #[derive(Debug, Clone, SimConnectObject)] #[simconnect(period = "second")] +#[allow(dead_code)] struct GpsData { #[simconnect(name = "PLANE LATITUDE", unit = "degrees")] lat: f64, @@ -17,13 +16,14 @@ struct GpsData { /// A second data structure that will be used to receive data from SimConnect. #[derive(Debug, Clone, SimConnectObject)] #[simconnect(period = "second", condition = "changed")] +#[allow(dead_code)] pub struct OnGround { #[simconnect(name = "SIM ON GROUND", unit = "bool")] sim_on_ground: bool, } fn main() -> Result<(), Box> { - let client = SimConnect::new("Simple Program"); + let client = SimConnect::new("Receiving data example"); match client { Ok(mut client) => loop { diff --git a/examples/src/data_with_tracing.rs b/examples/src/data_with_tracing.rs index c9f8396..dd9d295 100644 --- a/examples/src/data_with_tracing.rs +++ b/examples/src/data_with_tracing.rs @@ -1,5 +1,3 @@ -#![allow(dead_code)] - use simconnect_sdk::{Notification, SimConnect, SimConnectObject}; use tracing::{error, info}; use tracing_subscriber::{fmt, prelude::*, EnvFilter}; @@ -7,6 +5,7 @@ use tracing_subscriber::{fmt, prelude::*, EnvFilter}; /// A data structure that will be used to receive data from SimConnect. #[derive(Debug, Clone, SimConnectObject)] #[simconnect(period = "second")] +#[allow(dead_code)] struct GpsData { #[simconnect(name = "PLANE LATITUDE", unit = "degrees")] lat: f64, @@ -19,7 +18,7 @@ struct GpsData { fn main() -> Result<(), Box> { setup_logging()?; - let client = SimConnect::new("Simple Program"); + let client = SimConnect::new("Receiving data example"); match client { Ok(mut client) => { diff --git a/examples/src/data_without_macro.rs b/examples/src/data_without_macro.rs index 487bf08..6f47da1 100644 --- a/examples/src/data_without_macro.rs +++ b/examples/src/data_without_macro.rs @@ -1,5 +1,3 @@ -#![allow(dead_code)] - use simconnect_sdk::{ Condition, DataType, Notification, Object, Period, SimConnect, SimConnectError, SimConnectObjectExt, @@ -7,6 +5,7 @@ use simconnect_sdk::{ /// A data structure that will be used to receive data from SimConnect. #[derive(Debug, Clone)] +#[allow(dead_code)] pub struct GpsData { lat: f64, lon: f64, @@ -34,7 +33,7 @@ impl TryFrom<&Object> for GpsData { } fn main() -> Result<(), Box> { - let client = SimConnect::new("Simple Program"); + let client = SimConnect::new("Receiving data example"); match client { Ok(mut client) => { diff --git a/examples/src/facilities.rs b/examples/src/facilities.rs index 5a782bc..48b88ff 100644 --- a/examples/src/facilities.rs +++ b/examples/src/facilities.rs @@ -1,7 +1,7 @@ use simconnect_sdk::{FacilityType, Notification, SimConnect}; fn main() -> Result<(), Box> { - let client = SimConnect::new("Simple Program"); + let client = SimConnect::new("Facilities example"); match client { Ok(mut client) => loop { diff --git a/simconnect-sdk/src/domain/notification.rs b/simconnect-sdk/src/domain/notification.rs index 3a3d42e..3d42094 100644 --- a/simconnect-sdk/src/domain/notification.rs +++ b/simconnect-sdk/src/domain/notification.rs @@ -31,6 +31,10 @@ pub struct Object { } impl Object { + /// Try and transmute this SimConnect object as a `T` struct. + /// + /// # Errors + /// - [`crate::SimConnectError::ObjectMismatch`] -- The type of this SimConnect object is different from `T`. pub fn try_transmute(&self) -> Result { let type_name: String = std::any::type_name::().into(); diff --git a/simconnect-sdk/src/lib.rs b/simconnect-sdk/src/lib.rs index 881cd6e..85af99e 100644 --- a/simconnect-sdk/src/lib.rs +++ b/simconnect-sdk/src/lib.rs @@ -9,65 +9,7 @@ //! ``` //! //! ```rust,no_run -//! use simconnect_sdk::{Notification, SimConnect, SimConnectObject}; -//! -//! /// A data structure that will be used to receive data from SimConnect. -//! #[derive(Debug, Clone, SimConnectObject)] -//! #[simconnect(period = "second")] -//! struct GpsData { -//! #[simconnect(name = "PLANE LATITUDE", unit = "degrees")] -//! lat: f64, -//! #[simconnect(name = "PLANE LONGITUDE", unit = "degrees")] -//! lon: f64, -//! #[simconnect(name = "PLANE LONGITUDE", unit = "degrees")] -//! alt: f64, -//! } -//! -//! fn main() -> Result<(), Box> { -//! let client = SimConnect::new("Simple Program"); -//! -//! match client { -//! Ok(mut client) => { -//! let mut notifications_received = 0; -//! -//! loop { -//! let notification = client.get_next_dispatch()?; -//! -//! match notification { -//! Some(Notification::Open) => { -//! println!("Connection opened."); -//! -//! // After the connection is successfully open, we register the struct -//! client.register_object::()?; -//! } -//! Some(Notification::Object(data)) => { -//! if let Ok(gps_data) = GpsData::try_from(&data) { -//! println!("{gps_data:?}"); -//! -//! notifications_received += 1; -//! -//! // After we have received 10 notifications, we unregister the struct -//! if notifications_received > 10 { -//! client.unregister_object::()?; -//! println!("Subscription stopped."); -//! break; -//! } -//! } -//! } -//! _ => (), -//! } -//! -//! // sleep for about a frame to reduce CPU usage -//! std::thread::sleep(std::time::Duration::from_millis(16)); -//! } -//! } -//! Err(e) => { -//! println!("Error: {e:?}") -//! } -//! } -//! -//! Ok(()) -//! } +#![doc = include_str!("../../examples/src/data.rs")] //! ``` //! //! See [more examples](https://github.com/mihai-dinculescu/simconnect-sdk/tree/main/examples). diff --git a/simconnect-sdk/src/simconnect/base.rs b/simconnect-sdk/src/simconnect/base.rs index a242749..4e71ffb 100644 --- a/simconnect-sdk/src/simconnect/base.rs +++ b/simconnect-sdk/src/simconnect/base.rs @@ -10,65 +10,7 @@ use crate::{ /// # Example /// /// ```rust,no_run -/// use simconnect_sdk::{Notification, SimConnect, SimConnectObject}; -/// -/// /// A data structure that will be used to receive data from SimConnect. -/// #[derive(Debug, Clone, SimConnectObject)] -/// #[simconnect(period = "second")] -/// struct GpsData { -/// #[simconnect(name = "PLANE LATITUDE", unit = "degrees")] -/// lat: f64, -/// #[simconnect(name = "PLANE LONGITUDE", unit = "degrees")] -/// lon: f64, -/// #[simconnect(name = "PLANE LONGITUDE", unit = "degrees")] -/// alt: f64, -/// } -/// -/// fn main() -> Result<(), Box> { -/// let client = SimConnect::new("Simple Program"); -/// -/// match client { -/// Ok(mut client) => { -/// let mut notifications_received = 0; -/// -/// loop { -/// let notification = client.get_next_dispatch()?; -/// -/// match notification { -/// Some(Notification::Open) => { -/// println!("Connection opened."); -/// -/// // After the connection is successfully open, we register the struct -/// client.register_object::()?; -/// } -/// Some(Notification::Object(data)) => { -/// if let Ok(gps_data) = GpsData::try_from(&data) { -/// println!("{gps_data:?}"); -/// -/// notifications_received += 1; -/// -/// // After we have received 10 notifications, we unregister the struct -/// if notifications_received > 10 { -/// client.unregister_object::()?; -/// println!("Subscription stopped."); -/// break; -/// } -/// } -/// } -/// _ => (), -/// } -/// -/// // sleep for about a frame to reduce CPU usage -/// std::thread::sleep(std::time::Duration::from_millis(16)); -/// } -/// } -/// Err(e) => { -/// println!("Error: {e:?}") -/// } -/// } -/// -/// Ok(()) -/// } +#[doc = include_str!("../../../examples/src/data.rs")] /// ``` #[derive(Debug)] pub struct SimConnect { diff --git a/simconnect-sdk/src/simconnect/objects.rs b/simconnect-sdk/src/simconnect/objects.rs index 8468598..e4bbef5 100644 --- a/simconnect-sdk/src/simconnect/objects.rs +++ b/simconnect-sdk/src/simconnect/objects.rs @@ -17,7 +17,7 @@ impl SimConnect { } // Unregister an object with SimConnect. - #[tracing::instrument(name = "SimConnect::register_object")] + #[tracing::instrument(name = "SimConnect::unregister_object")] pub fn unregister_object(&mut self) -> Result { let type_name: String = std::any::type_name::().into();