use std::fs::OpenOptions;
use std::io::{ Seek, SeekFrom, Write, Result };
pub struct LedMatrix {
fb: std::fs::File,
}
impl LedMatrix {
pub fn open() -> Result<Self> {
let fb = OpenOptions::new()
.read(true)
.write(true)
.open("/dev/fb0")?; Ok(LedMatrix {fb})
}
pub fn set_pixel(&mut self, x: usize, y: usize, r: u8, g: u8, b: u8) -> Result<()> {
let offset = (y * 8 + x) * 2;
let data = rgb_to_rgb565(r, g, b);
self.fb.seek(SeekFrom::Start(offset as u64))?;
self.fb.write_all(&data)?;
Ok(())
}
pub fn clear(&mut self) -> Result<()> {
let zeros = [0u8; 128];
self.fb.seek(SeekFrom::Start(0))?;
self.fb.write_all(&zeros)?;
Ok(())
}
}
fn rgb_to_rgb565(r: u8, g: u8, b: u8) -> [u8; 2] {
let r5 = (r >> 3) as u16;
let g6 = (g >> 2) as u16;
let b5 = (b >> 3) as u16;
let value = (r5 << 11) | (g6 << 5) | b5;
value.to_le_bytes()
}