driver_99bugs_display/
lib.rs1extern 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
15const 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]) {
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}