logitech-lcd 2.0.0

Rust bindings for the Logitech Gaming LCD/Gamepanel SDK.
Documentation
extern crate image;
extern crate logitech_lcd;

use logitech_lcd::{Lcd, MONO_WIDTH, MONO_HEIGHT};
use image::{ImageFormat, ImageRgba8};

fn load_image_into_buffer() -> Vec<u8> {
    let logo_data = include_bytes!("rust-logo-32x32-blk.png");
    let logo_img = match image::load_from_memory_with_format(logo_data, ImageFormat::PNG).unwrap() {
        ImageRgba8(img) => img,
        _ => panic!("unexpected image format"),
    };

    let mut buf = std::iter::repeat(0u8)
        .take(MONO_WIDTH * MONO_HEIGHT)
        .collect::<Vec<u8>>();

    let my = (MONO_HEIGHT - logo_img.height() as usize) / 2;
    let mx = MONO_WIDTH - logo_img.width() as usize;

    for p in logo_img.enumerate_pixels() {
        let x = p.0 as usize;
        let y = my + p.1 as usize;
        buf[y * MONO_WIDTH + x] = p.2.data[3];
    }

    for p in logo_img.enumerate_pixels() {
        let x = mx + p.0 as usize;
        let y = my + p.1 as usize;
        buf[y * MONO_WIDTH + x] = p.2.data[3];
    }

    buf
}


fn main() {
    let buf = load_image_into_buffer();

    let mut lcd = Lcd::init_mono("Mono image app").unwrap();
    lcd.set_mono_text(1, "      Rust is Awesome").unwrap();
    lcd.set_mono_background(&buf[..]).unwrap();
    lcd.update();

    std::thread::sleep(std::time::Duration::from_millis(10000));
}