dungeonctl 0.1.0

Control smart electronic toys created by DG-LAB
Documentation
use std::time::Duration;

use dungeonctl::{
    Coyote3, Stereo,
    coyote3::{DeviceSettings, IntensityChange, Pulse, Pulses},
};
use futures_signals::signal::SignalExt;
use tracing::info;

#[tokio::main]
async fn main() -> eyre::Result<()> {
    tracing_subscriber::fmt()
        .with_env_filter(
            tracing_subscriber::EnvFilter::try_from_default_env()
                .or_else(|_| "info,dungeonctl=debug".parse())?,
        )
        .with_target(false)
        .with_file(true)
        .with_line_number(true)
        .init();

    let coyote = Coyote3::connect()
        .settings(DeviceSettings {
            limit: Stereo { a: 50, b: 0 },
            ..Default::default()
        })
        .await?;

    async fn stim(coyote: &Coyote3) -> eyre::Result<()> {
        coyote
            .send_pulses(Pulses {
                intensity: Stereo {
                    a: IntensityChange::AbsoluteChange(20),
                    b: IntensityChange::AbsoluteChange(0),
                },
                pulses: [Stereo {
                    a: Pulse {
                        frequency: 0,
                        intensity: 0,
                    },
                    b: Pulse {
                        frequency: 0,
                        intensity: 0,
                    },
                }; 4],
            })
            .await?;

        for i in 0u64.. {
            coyote
                .send_pulses(Pulses {
                    intensity: Stereo {
                        a: IntensityChange::DoNotChange,
                        b: IntensityChange::DoNotChange,
                    },
                    pulses: [Stereo {
                        a: Pulse {
                            frequency: 200,
                            intensity: 50
                                + (50.0
                                    * ((std::f32::consts::TAU * (i as f32) / 20.0).sin() / 2.0
                                        + 0.5)) as u8,
                        },
                        b: Pulse {
                            frequency: 0,
                            intensity: 0,
                        },
                    }; 4],
                })
                .await?;

            tokio::time::sleep(Duration::from_millis(100)).await;
        }

        Ok(())
    }

    tokio::select!(
        _ = coyote.state().for_each(async |state| info!(?state)) => Ok(()),
        res = async {
            stim(&coyote).await?;

            coyote.disconnect().await?;

            Ok(())
        } => res,
        res = async {
            tokio::signal::ctrl_c()
                .await?;

            coyote.disconnect().await?;

            Ok(())
        } => res,
    )
}