Prepare for publishing
This commit is contained in:
@@ -1,10 +1,15 @@
|
||||
[package]
|
||||
name = "simconnect-sdk"
|
||||
version = "0.1.0"
|
||||
authors = ["Mihai Dinculescu <mihai.dinculescu@outlook.com>"]
|
||||
edition = "2021"
|
||||
description = "SimConnect SDK for Rust"
|
||||
license = "MIT"
|
||||
authors = ["Mihai Dinculescu <mihai.dinculescu@outlook.com>"]
|
||||
description = "SimConnect SDK"
|
||||
keywords = ["simconnect", "MSFS-2020", "simulation", "aerospace"]
|
||||
categories = ["aerospace", "simulation", "aerospace::simulation", "games"]
|
||||
readme = "README.md"
|
||||
repository = "https://github.com/mihai-dinculescu/simconnect-sdk"
|
||||
include = ["src/**", "ffi/**/*", "build.rs", "LICENSE", "README.md"]
|
||||
|
||||
[features]
|
||||
default = []
|
||||
@@ -17,7 +22,7 @@ bindgen = "0.61"
|
||||
num_enum = "0.5"
|
||||
tracing = "0.1"
|
||||
thiserror = "1.0"
|
||||
simconnect-sdk-derive = { path = "../simconnect-sdk-derive", optional = true }
|
||||
simconnect-sdk-derive = { version = "=0.1.0", path = "../simconnect-sdk-derive", optional = true }
|
||||
|
||||
# docs.rs-specific configuration
|
||||
[package.metadata.docs.rs]
|
||||
|
21
simconnect-sdk/LICENSE
Normal file
21
simconnect-sdk/LICENSE
Normal file
@@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2022 Mihai Dinculescu
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
203
simconnect-sdk/README.md
Normal file
203
simconnect-sdk/README.md
Normal file
@@ -0,0 +1,203 @@
|
||||
# SimConnect SDK in Rust
|
||||
|
||||
[![Crates][crates_badge]][crates]
|
||||
[![Documentation][documentation_badge]][documentation]
|
||||
[![CI][ci_badge]][ci]
|
||||
[![license][license_badge]][license]
|
||||
[![Crates.io][crates_downloads_badge]][crates]\
|
||||
An opinionated SimConnect SDK that encapsulates the C API fully and optimizes for developer experience.
|
||||
|
||||
## Usage
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
simconnect-sdk = { version = "0.1", features = ["derive"] }
|
||||
```
|
||||
|
||||
```rust
|
||||
use simconnect_sdk::{Notification, SimConnect, SimConnectObject};
|
||||
|
||||
/// A data structure that will be used to receive data from SimConnect.
|
||||
/// See the documentation of `SimConnectObject` for more information on the arguments of the `simconnect` attribute.
|
||||
#[derive(Debug, Clone, SimConnectObject)]
|
||||
#[simconnect(period = "second")]
|
||||
#[allow(dead_code)]
|
||||
struct AirplaneData {
|
||||
#[simconnect(name = "TITLE")]
|
||||
title: String,
|
||||
#[simconnect(name = "CATEGORY")]
|
||||
category: String,
|
||||
#[simconnect(name = "PLANE LATITUDE", unit = "degrees")]
|
||||
lat: f64,
|
||||
#[simconnect(name = "PLANE LONGITUDE", unit = "degrees")]
|
||||
lon: f64,
|
||||
#[simconnect(name = "PLANE ALTITUDE", unit = "feet")]
|
||||
alt: f64,
|
||||
#[simconnect(name = "SIM ON GROUND")]
|
||||
sim_on_ground: bool,
|
||||
}
|
||||
|
||||
fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
let client = SimConnect::new("Receiving data example");
|
||||
|
||||
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::<AirplaneData>()?;
|
||||
}
|
||||
Some(Notification::Object(data)) => {
|
||||
if let Ok(airplane_data) = AirplaneData::try_from(&data) {
|
||||
println!("{airplane_data:?}");
|
||||
|
||||
notifications_received += 1;
|
||||
|
||||
// After we have received 10 notifications, we unregister the struct
|
||||
if notifications_received > 10 {
|
||||
client.unregister_object::<AirplaneData>()?;
|
||||
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(())
|
||||
}
|
||||
```
|
||||
|
||||
See [more examples][examples].
|
||||
|
||||
## Contributing
|
||||
|
||||
Contributions are welcome and encouraged! See [/CONTRIBUTING.md][contributing].
|
||||
|
||||
## Feature table
|
||||
|
||||
### General
|
||||
|
||||
| Feature | Status | Comment |
|
||||
| --------------------------------------- | ------- | ----------- |
|
||||
| DispatchProc | | |
|
||||
| SimConnect_Open | ✓ | |
|
||||
| SimConnect_Close | ✓ | |
|
||||
| SimConnect_CallDispatch | | |
|
||||
| SimConnect_GetNextDispatch | ✓ | |
|
||||
| SimConnect_RequestSystemState | | |
|
||||
| SimConnect_MapClientEventToSimEvent | - | Coming soon |
|
||||
| SimConnect_SubscribeToSystemEvent | | |
|
||||
| SimConnect_SetSystemEventState | | |
|
||||
| SimConnect_UnsubscribeFromSystemEvent | | |
|
||||
| SimConnect_SetNotificationGroupPriority | - | Coming soon |
|
||||
|
||||
### Events And Data
|
||||
|
||||
| Feature | Status | Comment |
|
||||
| -------------------------------------------- | ------- | ----------------------------------- |
|
||||
| SimConnect_RequestDataOnSimObject | ✓ | Only for SIMCONNECT_OBJECT_ID_USER |
|
||||
| SimConnect_RequestDataOnSimObjectType | - | Coming soon |
|
||||
| SimConnect_AddClientEventToNotificationGroup | - | Coming soon |
|
||||
| SimConnect_RemoveClientEvent | | |
|
||||
| SimConnect_TransmitClientEvent | | |
|
||||
| SimConnect_TransmitClientEvent_EX1 | | |
|
||||
| SimConnect_MapClientDataNameToID | | |
|
||||
| SimConnect_RequestClientData | | |
|
||||
| SimConnect_CreateClientData | | |
|
||||
| SimConnect_AddToClientDataDefinition | | |
|
||||
| SimConnect_AddToDataDefinition | ✓ | Supports `f64`, `bool` and `String` |
|
||||
| SimConnect_SetClientData | | |
|
||||
| SimConnect_SetDataOnSimObject | | |
|
||||
| SimConnect_ClearClientDataDefinition | | |
|
||||
| SimConnect_ClearDataDefinition | ✓ | |
|
||||
| SimConnect_MapInputEventToClientEvent | | |
|
||||
| SimConnect_RequestNotificationGroup | | |
|
||||
| SimConnect_ClearInputGroup | | |
|
||||
| SimConnect_ClearNotificationGroup | | |
|
||||
| SimConnect_RequestReservedKey | | |
|
||||
| SimConnect_SetInputGroupPriority | | |
|
||||
| SimConnect_SetInputGroupState | | |
|
||||
| SimConnect_RemoveInputEvent | | |
|
||||
|
||||
### AI Objects
|
||||
|
||||
| Feature | Status | Comment |
|
||||
| ------------------------------------- | ------ | ------- |
|
||||
| SimConnect_AICreateEnrouteATCAircraft | | |
|
||||
| SimConnect_AICreateNonATCAircraft | | |
|
||||
| SimConnect_AICreateParkedATCAircraft | | |
|
||||
| SimConnect_AICreateSimulatedObject | | |
|
||||
| SimConnect_AIReleaseControl | | |
|
||||
| SimConnect_AIRemoveObject | | |
|
||||
| SimConnect_AISetAircraftFlightPlan | | |
|
||||
|
||||
### Flights
|
||||
|
||||
| Feature | Status | Comment |
|
||||
| ------------------------- | ------ | ------- |
|
||||
| SimConnect_FlightLoad | | |
|
||||
| SimConnect_FlightSave | | |
|
||||
| SimConnect_FlightPlanLoad | | |
|
||||
|
||||
### Debug
|
||||
|
||||
| Feature | Status | Comment |
|
||||
| ------------------------------- | ------ | ------- |
|
||||
| SimConnect_GetLastSentPacketID | | |
|
||||
| SimConnect_RequestResponseTimes | | |
|
||||
| SimConnect_InsertString | | |
|
||||
| SimConnect_RetrieveString | | |
|
||||
|
||||
### Facilities
|
||||
|
||||
| Feature | Status | Comment |
|
||||
| -------------------------------------- | ------- | ------- |
|
||||
| SimConnect_AddToFacilityDefinition | | |
|
||||
| SimConnect_RequestFacilitesList | ✓ | |
|
||||
| SimConnect_RequestFacilitiesList_EX1 | | |
|
||||
| SimConnect_RequestFacilityData | | |
|
||||
| SimConnect_SubscribeToFacilities | ✓ | |
|
||||
| SimConnect_SubscribeToFacilities_EX1 | | |
|
||||
| SimConnect_UnsubscribeToFacilities | ✓ | |
|
||||
| SimConnect_UnsubscribeToFacilities_EX1 | | |
|
||||
|
||||
### Missions
|
||||
|
||||
| Feature | Status | Comment |
|
||||
| -------------------------------------- | ------ | ------- |
|
||||
| SimConnect_CompleteCustomMissionAction | | |
|
||||
| SimConnect_ExecuteMissionAction | | |
|
||||
|
||||
## Credits
|
||||
|
||||
Inspired by [Sequal32/simconnect-rust][inspired_by].
|
||||
|
||||
[crates_badge]: https://img.shields.io/crates/v/simconnect-sdk.svg
|
||||
[crates]: https://crates.io/crates/simconnect-sdk
|
||||
[documentation_badge]: https://docs.rs/simconnect-sdk/badge.svg
|
||||
[documentation]: https://docs.rs/simconnect-sdk
|
||||
[ci_badge]: https://github.com/mihai-dinculescu/simconnect-sdk/workflows/CI/badge.svg?branch=main
|
||||
[ci]: https://github.com/mihai-dinculescu/simconnect-sdk/actions
|
||||
[license_badge]: https://img.shields.io/crates/l/simconnect-sdk.svg
|
||||
[license]: https://github.com/mihai-dinculescu/simconnect-sdk/blob/main/LICENSE
|
||||
[crates_downloads_badge]: https://img.shields.io/crates/d/simconnect-sdk?label=downloads
|
||||
[examples]: https://github.com/mihai-dinculescu/simconnect-sdk/tree/main/examples
|
||||
[contributing]: https://github.com/mihai-dinculescu/simconnect-sdk/blob/main/CONTRIBUTING.md
|
||||
[inspired_by]: https://github.com/Sequal32/simconnect-rust
|
@@ -9,7 +9,73 @@
|
||||
//! ```
|
||||
//!
|
||||
//! ```rust,no_run
|
||||
#![doc = include_str!("../../examples/src/data.rs")]
|
||||
//! use simconnect_sdk::{Notification, SimConnect, SimConnectObject};
|
||||
//!
|
||||
//! /// A data structure that will be used to receive data from SimConnect.
|
||||
//! /// See the documentation of `SimConnectObject` for more information on the arguments of the `simconnect` attribute.
|
||||
//! #[derive(Debug, Clone, SimConnectObject)]
|
||||
//! #[simconnect(period = "second")]
|
||||
//! #[allow(dead_code)]
|
||||
//! struct AirplaneData {
|
||||
//! #[simconnect(name = "TITLE")]
|
||||
//! title: String,
|
||||
//! #[simconnect(name = "CATEGORY")]
|
||||
//! category: String,
|
||||
//! #[simconnect(name = "PLANE LATITUDE", unit = "degrees")]
|
||||
//! lat: f64,
|
||||
//! #[simconnect(name = "PLANE LONGITUDE", unit = "degrees")]
|
||||
//! lon: f64,
|
||||
//! #[simconnect(name = "PLANE ALTITUDE", unit = "feet")]
|
||||
//! alt: f64,
|
||||
//! #[simconnect(name = "SIM ON GROUND")]
|
||||
//! sim_on_ground: bool,
|
||||
//! }
|
||||
//!
|
||||
//! fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
//! let client = SimConnect::new("Receiving data example");
|
||||
//!
|
||||
//! 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::<AirplaneData>()?;
|
||||
//! }
|
||||
//! Some(Notification::Object(data)) => {
|
||||
//! if let Ok(airplane_data) = AirplaneData::try_from(&data) {
|
||||
//! println!("{airplane_data:?}");
|
||||
//!
|
||||
//! notifications_received += 1;
|
||||
//!
|
||||
//! // After we have received 10 notifications, we unregister the struct
|
||||
//! if notifications_received > 10 {
|
||||
//! client.unregister_object::<AirplaneData>()?;
|
||||
//! 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(())
|
||||
//! }
|
||||
//! ```
|
||||
//!
|
||||
//! See [more examples](https://github.com/mihai-dinculescu/simconnect-sdk/tree/main/examples).
|
||||
|
@@ -10,7 +10,73 @@ use crate::{
|
||||
/// # Example
|
||||
///
|
||||
/// ```rust,no_run
|
||||
#[doc = include_str!("../../../examples/src/data.rs")]
|
||||
/// use simconnect_sdk::{Notification, SimConnect, SimConnectObject};
|
||||
///
|
||||
/// /// A data structure that will be used to receive data from SimConnect.
|
||||
/// /// See the documentation of `SimConnectObject` for more information on the arguments of the `simconnect` attribute.
|
||||
/// #[derive(Debug, Clone, SimConnectObject)]
|
||||
/// #[simconnect(period = "second")]
|
||||
/// #[allow(dead_code)]
|
||||
/// struct AirplaneData {
|
||||
/// #[simconnect(name = "TITLE")]
|
||||
/// title: String,
|
||||
/// #[simconnect(name = "CATEGORY")]
|
||||
/// category: String,
|
||||
/// #[simconnect(name = "PLANE LATITUDE", unit = "degrees")]
|
||||
/// lat: f64,
|
||||
/// #[simconnect(name = "PLANE LONGITUDE", unit = "degrees")]
|
||||
/// lon: f64,
|
||||
/// #[simconnect(name = "PLANE ALTITUDE", unit = "feet")]
|
||||
/// alt: f64,
|
||||
/// #[simconnect(name = "SIM ON GROUND")]
|
||||
/// sim_on_ground: bool,
|
||||
/// }
|
||||
///
|
||||
/// fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||
/// let client = SimConnect::new("Receiving data example");
|
||||
///
|
||||
/// 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::<AirplaneData>()?;
|
||||
/// }
|
||||
/// Some(Notification::Object(data)) => {
|
||||
/// if let Ok(airplane_data) = AirplaneData::try_from(&data) {
|
||||
/// println!("{airplane_data:?}");
|
||||
///
|
||||
/// notifications_received += 1;
|
||||
///
|
||||
/// // After we have received 10 notifications, we unregister the struct
|
||||
/// if notifications_received > 10 {
|
||||
/// client.unregister_object::<AirplaneData>()?;
|
||||
/// 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(())
|
||||
/// }
|
||||
/// ```
|
||||
#[derive(Debug)]
|
||||
pub struct SimConnect {
|
||||
|
Reference in New Issue
Block a user