Advertisement
Generic01

io error

Oct 29th, 2024 (edited)
162
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Rust 5.08 KB | None | 0 0
  1. use std::{sync::Arc, time::Duration};
  2.  
  3. use iced::{
  4.     widget::{column, container, row, svg, tooltip, Button, Tooltip},
  5.     Alignment, Element,
  6.     Length::{self, Fill},
  7.     Task, Theme,
  8. };
  9. use tokio::{runtime::Builder, sync::Mutex};
  10. use tokio_serial::SerialPort;
  11.  
  12. #[derive(Debug)]
  13. pub struct Keypad {
  14.     pub serial_port: Arc<Mutex<Box<dyn SerialPort>>>,
  15. }
  16.  
  17. impl Clone for Keypad {
  18.     fn clone(&self) -> Self {
  19.         Keypad {
  20.             serial_port: self.serial_port.clone(),
  21.         }
  22.     }
  23. }
  24.  
  25. pub fn new() -> (Self, Task<Message>) {
  26.         let initial_screen = Screen::default(); // Установка стартового экрана
  27.         let runtime = Builder::new_current_thread().enable_all().build().unwrap();
  28.         let port_name = runtime.block_on(async { get_keypad_port().await });
  29.         // let serial_port: Rc<Box<dyn SerialPort>> = tokio_serial::new(port_name, 115_200)
  30.         //     .timeout(Duration::from_millis(10))
  31.         //     .open()
  32.         //     .expect("Failed to open port")
  33.         //     .into();
  34.  
  35.         let serial_port: Arc<Mutex<Box<dyn SerialPort>>> = Arc::new(Mutex::new(
  36.             tokio_serial::new(port_name, 115_200)
  37.                 .timeout(Duration::from_millis(10))
  38.                 .open()
  39.                 .expect("Failed to open port"),
  40.         ));
  41.  
  42.         let _ = runtime.block_on(async {
  43.             let mut port = serial_port.lock().await;
  44.  
  45.             port.write_data_terminal_ready(true)
  46.         });
  47.  
  48.         let keypad = Keypad { serial_port };
  49.  
  50.         (
  51.             Self {
  52.                 screen: initial_screen,
  53.                 keypad,
  54.             },
  55.             Task::none(),
  56.         )
  57.     }
  58.  
  59. async fn process_ports(ports: Vec<String>) -> String {
  60.     let mut result = String::new();
  61.     let write_data_array: [u16; ARRAY_LEN] = [101, 0, 0, 0, 0, 0, 0, 0, 0];
  62.     for port_name in ports.iter() {
  63.         let port = match new(port_name, 115_200)
  64.             .timeout(Duration::from_millis(10))
  65.             .open()
  66.         {
  67.             Ok(port) => Arc::new(Mutex::new(port)),
  68.             Err(err) => {
  69.                 eprintln!("Ошибка открытия порта {}: {}", port_name, err);
  70.                 continue;
  71.             }
  72.         };
  73.        
  74.         // Пишем данные в порт
  75.         match write_keypad_port(port.clone(), write_data_array).await {
  76.             Ok(_) => {
  77.                 match read_keypad_port(port.clone()).await {
  78.                     Ok(_) => result.push_str(port_name),
  79.                     Err(err) => {
  80.                         eprintln!("Ошибка чтения из порта {}: {}", port_name, err);
  81.                         continue;
  82.                     }
  83.                 };
  84.             }
  85.             Err(err) => {
  86.                 eprintln!("Ошибка записи в порт {}: {}", port_name, err);
  87.                 continue;
  88.             }
  89.         };
  90.     }
  91.     result
  92. }
  93.  
  94. #[cfg(target_os = "linux")]
  95. pub async fn get_keypad_port() -> String {
  96.     let ports = tokio_serial::available_ports().expect("No ports found!");
  97.     let mut vec_ports_str = Vec::new();
  98.     let regex = Regex::new(r"/dev/ttyACM\d+").unwrap();
  99.  
  100.     for port in ports.into_iter() {
  101.         let port_name_string = port.port_name;
  102.         vec_ports_str.push(port_name_string);
  103.     }
  104.  
  105.     let filtered_ports: Vec<String> = vec_ports_str
  106.         .into_iter()
  107.         .filter(|port_name| regex.is_match(port_name))
  108.         .collect();
  109.     process_ports(filtered_ports).await
  110. }
  111.  
  112. #[cfg(target_os = "windows")]
  113. pub async fn get_keypad_port() -> String {
  114.     let mut vec_ports_str: Vec<String> = Vec::new();
  115.     let ports = tokio_serial::available_ports().expect("No ports found!");
  116.  
  117.     for port in ports.into_iter() {
  118.         let port_name = port.port_name;
  119.         vec_ports_str.push(port_name);
  120.     }
  121.  
  122.     let filtered_ports: Vec<String> = vec_ports_str
  123.         .into_iter()
  124.         .filter(|port| !port.contains("COM1"))
  125.         .collect();
  126.     process_ports(filtered_ports).await
  127. }
  128.  
  129.  
  130. pub async fn write_keypad_port(
  131.     port: Arc<Mutex<Box<dyn SerialPort>>>,
  132.     write_data_array: [u16; ARRAY_LEN],
  133. ) -> Result<String, tokio_serial::Error> {
  134.     let write_data = command_to_string(&write_data_array).await;
  135.     let mut port_lock = port.lock().await;
  136.     port_lock.write_all(write_data.as_bytes())?;
  137.  
  138.     Ok(String::new())
  139. }
  140.  
  141. pub async fn read_keypad_port(
  142.     port: Arc<Mutex<Box<dyn SerialPort>>>,
  143. ) -> Result<String, tokio_serial::Error> {
  144.     let mut serial_buf = vec![0; 256];
  145.     let mut port_lock = port.lock().await;
  146.     match port_lock.read(serial_buf.as_mut_slice()) {
  147.         Ok(_m) => {
  148.             let buf = String::from_utf8(serial_buf).unwrap();
  149.             let trimmed_buf = buf.trim_end_matches(|c: char| c.is_control()).to_string();
  150.             let ok_trimmed_buf = Ok(trimmed_buf);
  151.  
  152.             println!("{:?}", ok_trimmed_buf);
  153.             ok_trimmed_buf
  154.         }
  155.         Err(err) => {
  156.             // eprintln!("Ошибка чтения из порта: {}", err);
  157.             Err(tokio_serial::Error::from(err))
  158.         }
  159.     }
  160. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement