use std::time::Duration;
use std::convert::From;
use serialport;
#[derive(PartialEq, Clone, Eq, Copy, Debug)]
pub enum DataBits {
Five,
Six,
Seven,
Eight
}
impl From<serialport::DataBits> for DataBits {
fn from(data_bits: serialport::DataBits) -> Self {
match data_bits {
serialport::DataBits::Five => DataBits::Five,
serialport::DataBits::Six => DataBits::Six,
serialport::DataBits::Seven => DataBits::Seven,
serialport::DataBits::Eight => DataBits::Eight
}
}
}
impl From<DataBits> for serialport::DataBits {
fn from(data_bits: DataBits) -> Self {
match data_bits {
DataBits::Five => serialport::DataBits::Five,
DataBits::Six => serialport::DataBits::Six,
DataBits::Seven => serialport::DataBits::Seven,
DataBits::Eight => serialport::DataBits::Eight
}
}
}
#[derive(PartialEq, Clone, Eq, Copy, Debug)]
pub enum Parity {
None,
Even,
Odd
}
impl From<serialport::Parity> for Parity {
fn from(parity: serialport::Parity) -> Self {
match parity {
serialport::Parity::None => Parity::None,
serialport::Parity::Even => Parity::Even,
serialport::Parity::Odd => Parity::Odd
}
}
}
impl From<Parity> for serialport::Parity {
fn from(parity: Parity) -> Self {
match parity {
Parity::None => serialport::Parity::None,
Parity::Even => serialport::Parity::Even,
Parity::Odd => serialport::Parity::Odd
}
}
}
#[derive(PartialEq, Clone, Eq, Copy, Debug)]
pub enum StopBits {
One,
Two
}
impl From<serialport::StopBits> for StopBits {
fn from(stop_bits: serialport::StopBits) -> Self {
match stop_bits {
serialport::StopBits::One => StopBits::One,
serialport::StopBits::Two => StopBits::Two
}
}
}
impl From<StopBits> for serialport::StopBits {
fn from(stop_bits: StopBits) -> Self {
match stop_bits {
StopBits::One => serialport::StopBits::One,
StopBits::Two => serialport::StopBits::Two
}
}
}
#[derive(PartialEq, Clone, Eq, Copy, Debug)]
pub enum FlowControl {
None,
Software,
Hardware
}
impl From<serialport::FlowControl> for FlowControl {
fn from(parity: serialport::FlowControl) -> Self {
match parity {
serialport::FlowControl::None => FlowControl::None,
serialport::FlowControl::Software => FlowControl::Software,
serialport::FlowControl::Hardware => FlowControl::Hardware
}
}
}
impl From<FlowControl> for serialport::FlowControl {
fn from(parity: FlowControl) -> Self {
match parity {
FlowControl::None => serialport::FlowControl::None,
FlowControl::Software => serialport::FlowControl::Software,
FlowControl::Hardware => serialport::FlowControl::Hardware
}
}
}
#[derive(PartialEq, Clone, Eq, Copy, Debug)]
pub struct Settings {
pub baud_rate: u32,
pub timeout: u64,
pub data_bits: DataBits,
pub parity: Parity,
pub stop_bits: StopBits,
pub flow_control: FlowControl
}
impl Settings {
pub fn to_short_string(&self) -> String {
let data_bits = match self.data_bits {
DataBits::Five => 5,
DataBits::Six => 6,
DataBits::Seven => 7,
DataBits::Eight => 8
};
let parity = match self.parity {
Parity::None => "N",
Parity::Even => "E",
Parity::Odd => "O"
};
let stop_bits = match self.stop_bits {
StopBits::One => 1,
StopBits::Two => 2
};
format!("{} {}{}{}", self.baud_rate, data_bits, parity, stop_bits)
}
}
impl Default for Settings {
fn default() -> Settings {
Settings {
baud_rate: 9600,
timeout: 1000,
data_bits: DataBits::Eight,
parity: Parity::None,
stop_bits: StopBits::One,
flow_control: FlowControl::None
}
}
}
impl From<serialport::SerialPortSettings> for Settings {
fn from(settings: serialport::SerialPortSettings) -> Self {
Settings {
baud_rate: settings.baud_rate,
timeout: settings.timeout.as_millis() as u64,
data_bits: settings.data_bits.into(),
parity: settings.parity.into(),
stop_bits: settings.stop_bits.into(),
flow_control: settings.flow_control.into()
}
}
}
impl From<Settings> for serialport::SerialPortSettings {
fn from(settings: Settings) -> Self {
serialport::SerialPortSettings {
baud_rate: settings.baud_rate,
timeout: Duration::from_millis(settings.timeout),
data_bits: settings.data_bits.into(),
parity: settings.parity.into(),
stop_bits: settings.stop_bits.into(),
flow_control: settings.flow_control.into()
}
}
}