Skip to main content

autd3_rs/client/
config.rs

1use std::num::{NonZeroU32, NonZeroUsize};
2
3use core_affinity::CoreId;
4use thread_priority::ThreadPriority;
5
6use crate::error::{Error, PayloadError};
7use crate::protocol::MAX_IN_FLIGHT;
8
9pub const MAX_DEVICES: usize = 128;
10
11#[derive(Clone, Copy, Debug)]
12pub struct ClientConfig {
13    pub timeout_cycles: u32,
14    pub max_inflight: NonZeroUsize,
15    pub send_interval_cycles: NonZeroU32,
16    pub max_resync_rounds: NonZeroU32,
17    pub low_latency: bool,
18    pub reset_resend_cycles: u32,
19    pub rt_priority: Option<ThreadPriority>,
20    pub rt_affinity: Option<CoreId>,
21    pub validate_state: bool,
22}
23
24impl Default for ClientConfig {
25    fn default() -> Self {
26        Self {
27            timeout_cycles: 10,
28            max_inflight: NonZeroUsize::new(MAX_IN_FLIGHT).unwrap(),
29            send_interval_cycles: NonZeroU32::new(1).unwrap(),
30            max_resync_rounds: NonZeroU32::new(8).unwrap(),
31            low_latency: false,
32            reset_resend_cycles: 2,
33            rt_priority: None,
34            rt_affinity: None,
35            validate_state: true,
36        }
37    }
38}
39
40impl ClientConfig {
41    pub(super) fn validate(self) -> Result<Self, Error> {
42        if self.max_inflight.get() > MAX_IN_FLIGHT {
43            return Err(Error::InvalidPayload(PayloadError::MaxInFlightTooLarge {
44                max: MAX_IN_FLIGHT,
45            }));
46        }
47        Ok(self)
48    }
49}