Prepare for publishing
This commit is contained in:
2
.github/workflows/ci.yml
vendored
2
.github/workflows/ci.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
|||||||
toolchain: stable
|
toolchain: stable
|
||||||
override: true
|
override: true
|
||||||
- uses: davidB/rust-cargo-make@v1
|
- uses: davidB/rust-cargo-make@v1
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- name: Run format
|
- name: Run format
|
||||||
run: cargo make format
|
run: cargo make format
|
||||||
- name: Run check
|
- name: Run check
|
||||||
|
27
.github/workflows/publish.yml
vendored
Normal file
27
.github/workflows/publish.yml
vendored
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
name: Crates.io
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types:
|
||||||
|
- created
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
name: Publish
|
||||||
|
runs-on: windows-2022
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v3
|
||||||
|
with:
|
||||||
|
ref: main
|
||||||
|
- uses: actions-rs/toolchain@v1
|
||||||
|
with:
|
||||||
|
profile: minimal
|
||||||
|
toolchain: stable
|
||||||
|
override: true
|
||||||
|
- name: Run build
|
||||||
|
run: cargo build --release --verbose
|
||||||
|
- name: Run publish simconnect-sdk-derive
|
||||||
|
run: cargo publish -p simconnect-sdk-derive --token ${{ secrets.CRATES_IO_TOKEN }}
|
||||||
|
- name: Sleep for 30 seconds
|
||||||
|
run: Start-Sleep -s 30
|
||||||
|
shell: powershell
|
||||||
|
- name: Run publish simconnect-sdk
|
||||||
|
run: cargo publish -p simconnect-sdk --token ${{ secrets.CRATES_IO_TOKEN }}
|
2
.github/workflows/security-audit.yml
vendored
2
.github/workflows/security-audit.yml
vendored
@@ -19,7 +19,7 @@ jobs:
|
|||||||
name: Audit
|
name: Audit
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v3
|
||||||
- uses: actions-rs/toolchain@v1
|
- uses: actions-rs/toolchain@v1
|
||||||
with:
|
with:
|
||||||
profile: minimal
|
profile: minimal
|
||||||
|
15
CHANGELOG.md
Normal file
15
CHANGELOG.md
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
# Change Log
|
||||||
|
|
||||||
|
All notable changes to this project will be documented in this
|
||||||
|
file. This change log follows the conventions of
|
||||||
|
[keepachangelog.com][keepachangelog].
|
||||||
|
|
||||||
|
## [Unreleased]
|
||||||
|
|
||||||
|
## [v0.1.0] - 2022-10-22
|
||||||
|
|
||||||
|
### Initial Release of simconnect-sdk
|
||||||
|
|
||||||
|
[unreleased]: https://github.com/mihai-dinculescu/simconnect-sdk
|
||||||
|
[v0.1.0]: https://github.com/mihai-dinculescu/simconnect-sdk/tree/v0.1.0
|
||||||
|
[keepachangelog]: https://keepachangelog.com
|
30
CONTRIBUTING.md
Normal file
30
CONTRIBUTING.md
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
# Contributing
|
||||||
|
|
||||||
|
Contributions are welcome and encouraged! See [/issues][issues] for ideas, or suggest your own!
|
||||||
|
If you're thinking to create a PR with large feature/change, please first discuss it in an issue.
|
||||||
|
|
||||||
|
## Releases
|
||||||
|
|
||||||
|
- Update version in `simconnect-sdk-derive/Cargo.toml`
|
||||||
|
- Update version in `simconnect-sdk/Cargo.toml` (crate + `simconnect-sdk-derive`)
|
||||||
|
- Update CHANGELOG.md
|
||||||
|
- Commit
|
||||||
|
- Add tag
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git tag -a vX.X.X
|
||||||
|
```
|
||||||
|
|
||||||
|
- Push
|
||||||
|
|
||||||
|
```bash
|
||||||
|
git push --follow-tags
|
||||||
|
```
|
||||||
|
|
||||||
|
- Release\
|
||||||
|
Create a [new release][releases]. \
|
||||||
|
The `publish.yml` GitHub Action will pick it up and do the actual release to [crates.io][crates_io].
|
||||||
|
|
||||||
|
[issues]: https://github.com/mihai-dinculescu/simconnect-sdk/issues
|
||||||
|
[releases]: https://github.com/mihai-dinculescu/simconnect-sdk/releases
|
||||||
|
[crates_io]: https://crates.io
|
22
README.md
22
README.md
@@ -1,7 +1,10 @@
|
|||||||
# SimConnect SDK in Rust
|
# SimConnect SDK in Rust
|
||||||
|
|
||||||
|
[![Crates][crates_badge]][crates]
|
||||||
|
[![Documentation][documentation_badge]][documentation]
|
||||||
[![CI][ci_badge]][ci]
|
[![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.
|
An opinionated SimConnect SDK that encapsulates the C API fully and optimizes for developer experience.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
@@ -83,6 +86,10 @@ fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
|
|
||||||
See [more examples][examples].
|
See [more examples][examples].
|
||||||
|
|
||||||
|
## Contributing
|
||||||
|
|
||||||
|
Contributions are welcome and encouraged! See [/CONTRIBUTING.md][contributing].
|
||||||
|
|
||||||
## Feature table
|
## Feature table
|
||||||
|
|
||||||
### General
|
### General
|
||||||
@@ -178,6 +185,19 @@ See [more examples][examples].
|
|||||||
| SimConnect_CompleteCustomMissionAction | | |
|
| SimConnect_CompleteCustomMissionAction | | |
|
||||||
| SimConnect_ExecuteMissionAction | | |
|
| 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_badge]: https://github.com/mihai-dinculescu/simconnect-sdk/workflows/CI/badge.svg?branch=main
|
||||||
[ci]: https://github.com/mihai-dinculescu/simconnect-sdk/actions
|
[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
|
[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
|
||||||
|
@@ -1,12 +1,16 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "simconnect-sdk-derive"
|
name = "simconnect-sdk-derive"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Mihai Dinculescu <mihai.dinculescu@outlook.com>"]
|
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "Macros of SimConnect SDK for Rust"
|
|
||||||
license = "MIT"
|
license = "MIT"
|
||||||
|
authors = ["Mihai Dinculescu <mihai.dinculescu@outlook.com>"]
|
||||||
|
description = "Macros implementation for 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/**", "LICENSE", "README.md"]
|
||||||
autotests = false
|
autotests = false
|
||||||
publish = false
|
|
||||||
|
|
||||||
[lib]
|
[lib]
|
||||||
proc-macro = true
|
proc-macro = true
|
||||||
|
21
simconnect-sdk-derive/LICENSE
Normal file
21
simconnect-sdk-derive/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-derive/README.md
Normal file
203
simconnect-sdk-derive/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
|
@@ -148,11 +148,8 @@ pub fn extract_attribute_properties(
|
|||||||
}
|
}
|
||||||
lit => {
|
lit => {
|
||||||
return Err(syn::Error::new_spanned(
|
return Err(syn::Error::new_spanned(
|
||||||
nv,
|
lit,
|
||||||
format!(
|
format!("Expected {:?}", property.field_type,),
|
||||||
"Expected {:?}, found {:?}",
|
|
||||||
property.field_type, lit
|
|
||||||
),
|
|
||||||
)
|
)
|
||||||
.to_compile_error())
|
.to_compile_error())
|
||||||
}
|
}
|
||||||
|
@@ -1,14 +1,14 @@
|
|||||||
error: Expected Str, found Int(LitInt { token: 123 })
|
error: Expected Str
|
||||||
--> tests/04-invalid-values.rs:5:14
|
--> tests/04-invalid-values.rs:5:23
|
||||||
|
|
|
|
||||||
5 | #[simconnect(period = 123, condition = "none")]
|
5 | #[simconnect(period = 123, condition = "none")]
|
||||||
| ^^^^^^^^^^^^
|
| ^^^
|
||||||
|
|
||||||
error: Expected Str, found Int(LitInt { token: 123 })
|
error: Expected Str
|
||||||
--> tests/04-invalid-values.rs:9:33
|
--> tests/04-invalid-values.rs:9:45
|
||||||
|
|
|
|
||||||
9 | #[simconnect(period = "second", condition = 123)]
|
9 | #[simconnect(period = "second", condition = 123)]
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^
|
||||||
|
|
||||||
error: `period` must be one of ["once", "visual-frame", "sim-frame", "second"].
|
error: `period` must be one of ["once", "visual-frame", "sim-frame", "second"].
|
||||||
--> tests/04-invalid-values.rs:13:14
|
--> tests/04-invalid-values.rs:13:14
|
||||||
@@ -22,17 +22,17 @@ error: `condition` must be one of ["none", "changed"].
|
|||||||
17 | #[simconnect(period = "second", condition = "X")]
|
17 | #[simconnect(period = "second", condition = "X")]
|
||||||
| ^^^^^^^^^^^^^^^
|
| ^^^^^^^^^^^^^^^
|
||||||
|
|
||||||
error: Expected Int, found Str(LitStr { token: "X" })
|
error: Expected Int
|
||||||
--> tests/04-invalid-values.rs:21:33
|
--> tests/04-invalid-values.rs:21:44
|
||||||
|
|
|
|
||||||
21 | #[simconnect(period = "second", interval = "X")]
|
21 | #[simconnect(period = "second", interval = "X")]
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^
|
||||||
|
|
||||||
error: Expected Int, found Float(LitFloat { token: 0.0 })
|
error: Expected Int
|
||||||
--> tests/04-invalid-values.rs:25:33
|
--> tests/04-invalid-values.rs:25:44
|
||||||
|
|
|
|
||||||
25 | #[simconnect(period = "second", interval = 0.0)]
|
25 | #[simconnect(period = "second", interval = 0.0)]
|
||||||
| ^^^^^^^^^^^^^^
|
| ^^^
|
||||||
|
|
||||||
error: Field type must be one of ["f64", "bool", "String"].
|
error: Field type must be one of ["f64", "bool", "String"].
|
||||||
--> tests/04-invalid-values.rs:32:14
|
--> tests/04-invalid-values.rs:32:14
|
||||||
|
@@ -1,10 +1,15 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "simconnect-sdk"
|
name = "simconnect-sdk"
|
||||||
version = "0.1.0"
|
version = "0.1.0"
|
||||||
authors = ["Mihai Dinculescu <mihai.dinculescu@outlook.com>"]
|
|
||||||
edition = "2021"
|
edition = "2021"
|
||||||
description = "SimConnect SDK for Rust"
|
|
||||||
license = "MIT"
|
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]
|
[features]
|
||||||
default = []
|
default = []
|
||||||
@@ -17,7 +22,7 @@ bindgen = "0.61"
|
|||||||
num_enum = "0.5"
|
num_enum = "0.5"
|
||||||
tracing = "0.1"
|
tracing = "0.1"
|
||||||
thiserror = "1.0"
|
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
|
# docs.rs-specific configuration
|
||||||
[package.metadata.docs.rs]
|
[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
|
//! ```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).
|
//! See [more examples](https://github.com/mihai-dinculescu/simconnect-sdk/tree/main/examples).
|
||||||
|
@@ -10,7 +10,73 @@ use crate::{
|
|||||||
/// # Example
|
/// # Example
|
||||||
///
|
///
|
||||||
/// ```rust,no_run
|
/// ```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)]
|
#[derive(Debug)]
|
||||||
pub struct SimConnect {
|
pub struct SimConnect {
|
||||||
|
Reference in New Issue
Block a user