X-Git-Url: https://code.octet-stream.net/m17rt/blobdiff_plain/253c89360003ac72c4f7078c03af973c58a1b129..bc4b6ea4290384cd8c380af2a9014f162fd43683:/m17app/src/serial.rs?ds=sidebyside diff --git a/m17app/src/serial.rs b/m17app/src/serial.rs new file mode 100644 index 0000000..d3eec19 --- /dev/null +++ b/m17app/src/serial.rs @@ -0,0 +1,47 @@ +use serialport::SerialPort; + +use crate::soundmodem::Ptt; + +/// The pin on the serial port which is driving PTT +pub enum PttPin { + // Ready To Send (RTS) + Rts, + // Data Terminal ready (DTR) + Dtr, +} + +pub struct SerialPtt { + port: Box, + pin: PttPin, +} + +impl SerialPtt { + pub fn available_ports() -> impl Iterator { + serialport::available_ports() + .unwrap_or_else(|_| vec![]) + .into_iter() + .map(|i| i.port_name) + } + + pub fn new(port_name: &str, pin: PttPin) -> Self { + // TODO: error handling + let port = serialport::new(port_name, 9600).open().unwrap(); + Self { port, pin } + } +} + +impl Ptt for SerialPtt { + fn ptt_on(&mut self) { + let _ = match self.pin { + PttPin::Rts => self.port.write_request_to_send(true), + PttPin::Dtr => self.port.write_data_terminal_ready(true), + }; + } + + fn ptt_off(&mut self) { + let _ = match self.pin { + PttPin::Rts => self.port.write_request_to_send(false), + PttPin::Dtr => self.port.write_data_terminal_ready(false), + }; + } +}