pokeys_lib/protocols/
onewire.rs

1//! 1-Wire protocol implementation
2
3use crate::device::PoKeysDevice;
4use crate::error::Result;
5
6/// 1-Wire protocol implementation
7impl PoKeysDevice {
8    /// Initialize 1-Wire bus
9    pub fn onewire_init(&mut self) -> Result<()> {
10        self.send_request(0xC0, 0, 0, 0, 0)?;
11        Ok(())
12    }
13
14    /// Reset 1-Wire bus
15    pub fn onewire_reset(&mut self) -> Result<bool> {
16        let response = self.send_request(0xC1, 0, 0, 0, 0)?;
17        Ok(response[8] != 0) // Device presence detected
18    }
19
20    /// Write byte to 1-Wire bus
21    pub fn onewire_write_byte(&mut self, data: u8) -> Result<()> {
22        self.send_request(0xC2, data, 0, 0, 0)?;
23        Ok(())
24    }
25
26    /// Read byte from 1-Wire bus
27    pub fn onewire_read_byte(&mut self) -> Result<u8> {
28        let response = self.send_request(0xC3, 0, 0, 0, 0)?;
29        Ok(response[8])
30    }
31
32    /// Search for 1-Wire devices
33    pub fn onewire_search(&mut self) -> Result<Vec<[u8; 8]>> {
34        let response = self.send_request(0xC4, 0, 0, 0, 0)?;
35
36        let mut devices = Vec::new();
37        let device_count = response[8] as usize;
38
39        for i in 0..device_count {
40            let start_idx = 9 + (i * 8);
41            if start_idx + 7 < response.len() {
42                let mut device_id = [0u8; 8];
43                device_id.copy_from_slice(&response[start_idx..start_idx + 8]);
44                devices.push(device_id);
45            }
46        }
47
48        Ok(devices)
49    }
50}