use std::convert::TryFrom;
use std::time::Duration;
#[cfg(windows)]
use winapi::shared::minwindef::DWORD;
#[cfg(windows)]
use winapi::um::winbase::COMMTIMEOUTS;
use crate::Result;
#[derive(Debug, Copy, Clone)]
pub struct CommTimeouts {
#[allow(missing_docs)]
pub read_interval_timeout: Duration,
#[allow(missing_docs)]
pub read_total_timeout_multiplier: Duration,
#[allow(missing_docs)]
pub read_total_timeout_constant: Duration,
#[allow(missing_docs)]
pub write_total_timeout_multiplier: Duration,
#[allow(missing_docs)]
pub write_total_timeout_constant: Duration,
}
#[cfg(windows)]
impl From<COMMTIMEOUTS> for CommTimeouts {
fn from(timeouts: COMMTIMEOUTS) -> Self {
CommTimeouts {
read_interval_timeout: Duration::from_millis(timeouts.ReadIntervalTimeout as u64),
read_total_timeout_multiplier: Duration::from_millis(
timeouts.ReadTotalTimeoutMultiplier as u64,
),
read_total_timeout_constant: Duration::from_millis(
timeouts.ReadTotalTimeoutConstant as u64,
),
write_total_timeout_multiplier: Duration::from_millis(
timeouts.WriteTotalTimeoutMultiplier as u64,
),
write_total_timeout_constant: Duration::from_millis(
timeouts.WriteTotalTimeoutConstant as u64,
),
}
}
}
#[cfg(windows)]
impl From<CommTimeouts> for COMMTIMEOUTS {
fn from(timeouts: CommTimeouts) -> Self {
COMMTIMEOUTS {
ReadIntervalTimeout: DWORD::try_from(timeouts.read_interval_timeout.as_millis())
.unwrap_or(DWORD::MAX),
ReadTotalTimeoutMultiplier: DWORD::try_from(
timeouts.read_total_timeout_multiplier.as_millis(),
)
.unwrap_or(DWORD::MAX),
ReadTotalTimeoutConstant: DWORD::try_from(
timeouts.read_total_timeout_constant.as_millis(),
)
.unwrap_or(DWORD::MAX),
WriteTotalTimeoutMultiplier: DWORD::try_from(
timeouts.write_total_timeout_multiplier.as_millis(),
)
.unwrap_or(DWORD::MAX),
WriteTotalTimeoutConstant: DWORD::try_from(
timeouts.write_total_timeout_constant.as_millis(),
)
.unwrap_or(DWORD::MAX),
}
}
}
pub trait SerialPortExt {
fn comm_timeouts(&self) -> Result<CommTimeouts>;
fn set_comm_timeouts(&self, timeouts: CommTimeouts) -> Result<()>;
}
impl SerialPortExt for crate::SerialPort {
fn comm_timeouts(&self) -> Result<CommTimeouts> {
self.0.comm_timeouts()
}
fn set_comm_timeouts(&self, timeouts: CommTimeouts) -> Result<()> {
self.0.set_comm_timeouts(timeouts)
}
}