driver_99bugs_display/
lib.rs

1extern crate spidev;
2use std::io::prelude::*;
3use self::spidev::{Spidev, SpidevOptions, SPI_MODE_0};
4use std::usize;
5
6pub const PANEL_LINE_SIZE: usize = 32;
7pub const PANEL_LINE_COUNT: usize = 32;
8pub const PANEL_COUNT: usize = 6;
9pub const LEDS_PER_PIXEL: usize = 3;
10
11pub const LINE_BUFFER_SIZE: usize = PANEL_LINE_SIZE * LEDS_PER_PIXEL;
12pub const PANEL_BUFFER_SIZE: usize = LINE_BUFFER_SIZE * PANEL_LINE_COUNT;
13pub const FRAME_BUFFER_SIZE: usize = PANEL_BUFFER_SIZE * PANEL_COUNT;
14
15// Commands:
16// 0x01: Line mode
17// 0x02: Panel mode
18// 0x03: Frame mode
19// 0x20: Flush (switch) buffer 
20
21const LINE_MODE: u8 = 0x01;
22const PANEL_MODE: u8 = 0x02;
23const FRAME_MODE: u8 = 0x03;
24const FLUSH: u8 = 0x20;
25
26pub struct Display {
27    spi: Spidev
28}
29
30impl Display {
31
32    pub fn new(device: &str) -> Display {
33        let options = SpidevOptions::new()
34            .mode(SPI_MODE_0)
35            .bits_per_word(8)
36            .max_speed_hz(16_000_000)
37            .build();
38        let mut spidev = Spidev::open(&device).unwrap();
39        spidev.configure(&options).unwrap();
40        Display { spi: spidev }
41    }
42
43    pub fn write_line(&mut self, panel: u8, line: u8, data: &[u8; LINE_BUFFER_SIZE]) {
44        const HEADER_SIZE: usize = 3;
45        
46        let mut buffer = Vec::with_capacity(HEADER_SIZE + LINE_BUFFER_SIZE);
47        let header = [LINE_MODE, panel, line];
48        buffer.extend_from_slice(&header);
49        buffer.extend_from_slice(&data[..]);
50
51        self.spi.write(&buffer).unwrap();
52    }
53
54    // pub fn write_frame(&mut self, data: &[u8; FRAME_BUFFER_SIZE]) {
55    pub fn write_frame(&mut self, data: &[u8]) {
56        const HEADER_SIZE: usize = 1;
57        
58        let mut buffer = Vec::with_capacity(HEADER_SIZE + FRAME_BUFFER_SIZE);
59        let header = [FRAME_MODE];
60        buffer.extend_from_slice(&header);
61        buffer.extend_from_slice(&data[..]);
62
63        self.spi.write(&buffer).unwrap();
64    }
65
66    pub fn flush(&mut self) {
67        self.spi.write(&[FLUSH]).unwrap();
68    }
69}