pokeys_lib/protocols/
uart.rs

1//! UART protocol implementation
2
3use crate::device::PoKeysDevice;
4use crate::error::{PoKeysError, Result};
5
6/// UART protocol implementation
7impl PoKeysDevice {
8    /// Configure UART interface
9    pub fn uart_configure(
10        &mut self,
11        baud_rate: u32,
12        data_bits: u8,
13        stop_bits: u8,
14        parity: u8,
15    ) -> Result<()> {
16        self.send_request(
17            0xD0,
18            (baud_rate & 0xFF) as u8,
19            ((baud_rate >> 8) & 0xFF) as u8,
20            data_bits,
21            stop_bits,
22        )?;
23
24        self.send_request(0xD1, parity, 0, 0, 0)?;
25        Ok(())
26    }
27
28    /// Write data to UART
29    pub fn uart_write(&mut self, data: &[u8]) -> Result<()> {
30        if data.len() > 60 {
31            return Err(PoKeysError::Parameter("UART data too long".to_string()));
32        }
33
34        self.send_request(0xD2, data.len() as u8, 0, 0, 0)?;
35        // Implementation would send data in subsequent request
36        Ok(())
37    }
38
39    /// Read data from UART
40    pub fn uart_read(&mut self) -> Result<Vec<u8>> {
41        let response = self.send_request(0xD3, 0, 0, 0, 0)?;
42
43        let mut data = Vec::new();
44        if response.len() > 8 {
45            let data_len = response[8] as usize;
46            if response.len() >= 9 + data_len {
47                data.extend_from_slice(&response[9..9 + data_len]);
48            }
49        }
50
51        Ok(data)
52    }
53
54    /// Check UART status
55    pub fn uart_status(&mut self) -> Result<(u8, u8)> {
56        let response = self.send_request(0xD4, 0, 0, 0, 0)?;
57        Ok((response[8], response[9])) // (tx_buffer_free, rx_bytes_available)
58    }
59}