#[cfg(feature = "native")]
pub mod native;
#[cfg(feature = "wasm")]
pub mod wasm;
use std::io::{Read, Write};
use std::time::Duration;
use crate::error::Result;
#[derive(Debug, Clone)]
pub struct SerialConfig {
pub port_name: String,
pub baud_rate: u32,
pub timeout: Duration,
pub data_bits: DataBits,
pub parity: Parity,
pub stop_bits: StopBits,
pub flow_control: FlowControl,
}
impl Default for SerialConfig {
fn default() -> Self {
Self {
port_name: String::new(),
baud_rate: 115200,
timeout: Duration::from_millis(1000),
data_bits: DataBits::Eight,
parity: Parity::None,
stop_bits: StopBits::One,
flow_control: FlowControl::None,
}
}
}
impl SerialConfig {
pub fn new(port_name: impl Into<String>, baud_rate: u32) -> Self {
Self {
port_name: port_name.into(),
baud_rate,
..Default::default()
}
}
#[must_use]
pub fn with_timeout(mut self, timeout: Duration) -> Self {
self.timeout = timeout;
self
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum DataBits {
Five,
Six,
Seven,
#[default]
Eight,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum Parity {
#[default]
None,
Odd,
Even,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum StopBits {
#[default]
One,
Two,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
pub enum FlowControl {
#[default]
None,
Hardware,
Software,
}
#[derive(Debug, Clone)]
pub struct PortInfo {
pub name: String,
pub vid: Option<u16>,
pub pid: Option<u16>,
pub manufacturer: Option<String>,
pub product: Option<String>,
pub serial_number: Option<String>,
}
pub trait Port: Read + Write + Send {
fn set_timeout(&mut self, timeout: Duration) -> Result<()>;
fn timeout(&self) -> Duration;
fn set_baud_rate(&mut self, baud_rate: u32) -> Result<()>;
fn baud_rate(&self) -> u32;
fn clear_buffers(&mut self) -> Result<()>;
fn name(&self) -> &str;
fn set_dtr(&mut self, level: bool) -> Result<()>;
fn set_rts(&mut self, level: bool) -> Result<()>;
fn read_cts(&self) -> Result<bool>;
fn read_dsr(&self) -> Result<bool>;
fn write_all_bytes(&mut self, buf: &[u8]) -> Result<()> {
std::io::Write::write_all(self, buf)?;
std::io::Write::flush(self)?;
Ok(())
}
}
pub trait PortEnumerator {
fn list_ports() -> Result<Vec<PortInfo>>;
fn find_by_vid_pid(vid: u16, pid: u16) -> Result<Vec<PortInfo>> {
let ports = Self::list_ports()?;
Ok(ports
.into_iter()
.filter(|p| p.vid == Some(vid) && p.pid == Some(pid))
.collect())
}
}
#[cfg(feature = "native")]
pub use native::{NativePort, NativePortEnumerator};
#[cfg(feature = "wasm")]
pub use wasm::{WebSerialPort, WebSerialPortEnumerator};