hinge-angle 0.1.0

A crate for accessing hinge angle sensors on various platforms
Documentation
hinge-angle
=============
[![crates](https://img.shields.io/crates/v/hinge-angle?style=for-the-badge)](https://crates.io/crates/hinge-angle/)
[![doc](https://img.shields.io/docsrs/hinge-angle?style=for-the-badge)](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 :)