i2cdev2/
mock.rs

1// Copyright 2015, Paul Osborne <osbpau@gmail.com>
2//
3// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
4// http://www.apache.org/license/LICENSE-2.0> or the MIT license
5// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
6// option.  This file may not be copied, modified, or distributed
7// except according to those terms.
8use core::I2CDevice;
9use std::io;
10
11pub type I2CResult<T> = io::Result<T>;
12
13pub struct I2CRegisterMap {
14    registers: [u8; 0xFF],
15    offset: usize,
16}
17
18impl I2CRegisterMap {
19    pub fn new() -> I2CRegisterMap {
20        I2CRegisterMap {
21            registers: [0x00; 0xFF],
22            offset: 0,
23        }
24    }
25
26    pub fn write_regs(&mut self, offset: usize, data: &[u8]) {
27        println!("WRITE | 0x{:X} : {:?}", offset, data);
28        for i in 0..data.len() {
29            self.registers[offset + i] = data[i];
30        }
31    }
32}
33
34impl I2CRegisterMap {
35    /// Read data from the device to fill the provided slice
36    fn read(&mut self, data: &mut [u8]) -> I2CResult<()> {
37        for i in 0..data.len() {
38            data[i] = self.registers[self.offset];
39            self.offset += 1;
40        }
41        println!("READ  | 0x{:X} : {:?}", self.offset - data.len(), data);
42        Ok(())
43    }
44
45    /// Write the provided buffer to the device
46    fn write(&mut self, data: &[u8]) -> I2CResult<()> {
47        // ASSUMPTION: first byte sets the offset
48        // ASSUMPTION: write has length of at least one (will panic)
49        let offset = data[0] as usize;
50        let remdata = &data[1..];
51        self.write_regs(offset, remdata);
52        self.offset = offset + remdata.len();
53        Ok(())
54    }
55}
56
57pub struct MockI2CDevice {
58    pub regmap: I2CRegisterMap,
59}
60
61
62impl MockI2CDevice {
63    pub fn new() -> MockI2CDevice {
64        MockI2CDevice { regmap: I2CRegisterMap::new() }
65    }
66}
67
68impl I2CDevice for MockI2CDevice {
69    type Error = io::Error;
70
71    fn read(&mut self, data: &mut [u8]) -> I2CResult<()> {
72        self.regmap.read(data)
73    }
74
75    fn write(&mut self, data: &[u8]) -> I2CResult<()> {
76        self.regmap.write(data)
77    }
78
79    fn smbus_write_quick(&mut self, _bit: bool) -> I2CResult<()> {
80        unimplemented!()
81    }
82
83    fn smbus_read_block_data(&mut self, _register: u8) -> I2CResult<Vec<u8>> {
84        unimplemented!()
85    }
86
87    fn smbus_write_block_data(&mut self, _register: u8, _values: &[u8]) -> I2CResult<()> {
88        unimplemented!()
89    }
90
91    fn smbus_process_block(&mut self, _register: u8, _values: &[u8]) -> I2CResult<Vec<u8>> {
92        unimplemented!()
93    }
94
95    fn smbus_read_i2c_block_data(&mut self, _register: u8, _len: u8) -> I2CResult<Vec<u8>> {
96        unimplemented!()
97    }
98
99    fn smbus_write_i2c_block_data(&mut self, _register: u8, _values: &[u8]) -> I2CResult<()> {
100        unimplemented!()
101    }
102}