hinge-angle
=============
[](https://crates.io/crates/hinge-angle/)
[](https://docs.rs/hinge-angle/latest/)
A Rust library for accessing hinge angle sensors on various platforms.
## Overview
This library provides a unified interface to access hinge angle sensors found in modern devices. It abstracts the platform-specific implementations behind a common `HingeAngle` trait.
## Supported Platforms
### macOS
Provides access to the MacBook's internal lid angle sensor.
- **Compatibility**: Introduced with the 2019 16-inch MacBook Pro. Works on newer MacBooks and iMacs.
- **Known Issues**: Does not work on M1/M2 devices.
### Android
Support for Android devices (implementation pending).
### Other platforms
There are plans to investigate support for Windows and Linux in the future. It's harder to find devices with hinge angle sensors on these platforms.
There's also a possibility to support WASM targets with [Posture API](https://developer.mozilla.org/en-US/docs/Web/API/Device_Posture_API), but it's still experimental and doesn't output angles directly.
It's also worth investigating asynchronous APIs for platforms that support it.
# Example
To find out whether your platform is supported just run:
```sh
cargo r --example=readloop
```
Alternatively, build the executable and copy to the test machine, for example:
```sh
cargo b --release --target=aarch64-apple-darwin --example=readloop
ls target/aarch64-apple-darwin/release/examples/readloop
```
## Usage
```rust no_run
use hinge_angle::HingeAngle;
use std::{error::Error, thread, time::Duration};
fn main() -> Result<(), Box<dyn Error>> {
#[cfg(target_os = "macos")]
{
use hinge_angle::macos::Hinge;
let hinge = Hinge::new()?;
loop {
let angle = hinge.angle()?;
println!("Hinge angle: {angle} degrees");
thread::sleep(Duration::from_secs(1));
}
}
// Add a platform-specific branch for Android when an implementation is available.
Ok(())
}
```
## Related Projects
- [LidAngleSensor](https://github.com/samhenrigold/LidAngleSensor): Original Objective-C implementation for macOS
## Contributing
Contributions are welcome! Please feel free to submit issues and pull requests.
Add a new platform, a new sensor ID or just make something better :)