autd3capi_def/
sampling_config.rs

1/*
2 * File: sampling_config.rs
3 * Project: src
4 * Created Date: 22/11/2023
5 * Author: Shun Suzuki
6 * -----
7 * Last Modified: 01/12/2023
8 * Modified By: Shun Suzuki (suzuki@hapis.k.u-tokyo.ac.jp)
9 * -----
10 * Copyright (c) 2023 Shun Suzuki. All rights reserved.
11 *
12 */
13
14use crate::ConstPtr;
15use autd3_driver::{defined::float, error::AUTDInternalError};
16
17#[derive(Clone, Copy, Debug)]
18#[repr(C)]
19pub struct SamplingConfiguration {
20    pub(crate) div: u32,
21}
22
23#[repr(C)]
24#[derive(Debug, Clone, Copy)]
25pub struct ResultSamplingConfig {
26    pub result: SamplingConfiguration,
27    pub err_len: u32,
28    pub err: ConstPtr,
29}
30
31impl From<autd3_driver::common::SamplingConfiguration> for SamplingConfiguration {
32    fn from(value: autd3_driver::common::SamplingConfiguration) -> Self {
33        Self {
34            div: value.frequency_division(),
35        }
36    }
37}
38
39impl From<SamplingConfiguration> for autd3_driver::common::SamplingConfiguration {
40    fn from(value: SamplingConfiguration) -> Self {
41        Self::from_frequency_division(value.div).unwrap()
42    }
43}
44
45#[no_mangle]
46#[must_use]
47pub unsafe extern "C" fn AUTDSamplingConfigFromFrequencyDivision(div: u32) -> ResultSamplingConfig {
48    autd3_driver::common::SamplingConfiguration::from_frequency_division(div).into()
49}
50
51#[no_mangle]
52#[must_use]
53pub unsafe extern "C" fn AUTDSamplingConfigFromFrequency(f: float) -> ResultSamplingConfig {
54    autd3_driver::common::SamplingConfiguration::from_frequency(f).into()
55}
56
57#[no_mangle]
58#[must_use]
59pub unsafe extern "C" fn AUTDSamplingConfigFromPeriod(p: u64) -> ResultSamplingConfig {
60    autd3_driver::common::SamplingConfiguration::from_period(std::time::Duration::from_nanos(p))
61        .into()
62}
63
64#[no_mangle]
65#[must_use]
66pub unsafe extern "C" fn AUTDSamplingConfigFrequencyDivision(config: SamplingConfiguration) -> u32 {
67    autd3_driver::common::SamplingConfiguration::from(config).frequency_division()
68}
69
70#[no_mangle]
71#[must_use]
72pub unsafe extern "C" fn AUTDSamplingConfigFrequency(config: SamplingConfiguration) -> float {
73    autd3_driver::common::SamplingConfiguration::from(config).frequency()
74}
75
76#[no_mangle]
77#[must_use]
78pub unsafe extern "C" fn AUTDSamplingConfigPeriod(config: SamplingConfiguration) -> u64 {
79    autd3_driver::common::SamplingConfiguration::from(config)
80        .period()
81        .as_nanos() as _
82}
83
84impl From<Result<autd3_driver::common::SamplingConfiguration, AUTDInternalError>>
85    for ResultSamplingConfig
86{
87    fn from(r: Result<autd3_driver::common::SamplingConfiguration, AUTDInternalError>) -> Self {
88        match r {
89            Ok(result) => Self {
90                result: result.into(),
91                err_len: 0,
92                err: std::ptr::null_mut(),
93            },
94            Err(e) => {
95                let err = e.to_string();
96                Self {
97                    result: SamplingConfiguration { div: 0 },
98                    err_len: err.as_bytes().len() as u32 + 1,
99                    err: Box::into_raw(Box::new(err)) as _,
100                }
101            }
102        }
103    }
104}