From 898617b0f59843a336470862d3b40d9c94aca31a Mon Sep 17 00:00:00 2001 From: saltire sable Date: Tue, 10 Nov 2020 01:11:44 -0500 Subject: [PATCH] Store a matrix object in server state and draw data to it --- src/main.rs | 4 +- src/matrix.rs | 146 ++++++++++++++++++++++++++++---------------------- src/server.rs | 10 ++-- web/web.js | 16 +++--- 4 files changed, 99 insertions(+), 77 deletions(-) diff --git a/src/main.rs b/src/main.rs index e8fd7d4..4f5a197 100644 --- a/src/main.rs +++ b/src/main.rs @@ -7,7 +7,7 @@ mod matrix; mod server; fn main() { - matrix::usb(); + let anime = matrix::Matrix::new().unwrap(); - server::start(); + server::start(anime); } diff --git a/src/matrix.rs b/src/matrix.rs index 1555fc2..d80cd8e 100644 --- a/src/matrix.rs +++ b/src/matrix.rs @@ -93,89 +93,105 @@ const PANE2_ROWS: [(usize, usize); 35] = [ const PANE2_Y_OFFSET: usize = 20; const PANE2_X_OFFSET: usize = 3; -fn send(buf: &[u8], device_handle: &DeviceHandle, timeout: &Duration) { - let mut buffer = [0u8; 640]; - for x in 0..buf.len() { - buffer[x] = buf[x]; - } - // println!("{:02X?}", buffer); - - match device_handle.write_control(REQUEST_TYPE, REQUEST, VALUE, 0, &buffer, *timeout) { - Ok(_) => {}, - Err(e) => println!("Error: {}", e) - } +pub struct Matrix { + device_handle: DeviceHandle, + timeout: Duration, } -fn send_pixels(pixels: Vec>, device_handle: &DeviceHandle, timeout: &Duration) { - let mut pane1 = [0u8; 640]; - for x in 0..7 { - pane1[x] = PANE1_HEADER[x]; - } - for (r, (index, width)) in PANE1_ROWS.iter().enumerate() { - for x in 0..*width { - pane1[index + x] = pixels[r][x]; +impl Matrix { + fn send(&self, buf: &[u8]) { + let mut buffer = [0u8; 640]; + for x in 0..buf.len() { + buffer[x] = buf[x]; } - } + // println!("{:02X?}", buffer); - let mut pane2 = [0u8; 640]; - for x in 0..7 { - pane2[x] = PANE2_HEADER[x]; + match self.device_handle.write_control(REQUEST_TYPE, REQUEST, VALUE, 0, &buffer, self.timeout) { + Ok(_) => {}, + Err(e) => println!("Error: {}", e) + } } - for (r, (index, width)) in PANE2_ROWS.iter().enumerate() { - let x_offset = if r == 0 { PANE2_X_OFFSET } else { 0 }; - for x in 0..*width { - pane2[index + x] = pixels[r + PANE2_Y_OFFSET][x + x_offset]; + + pub fn send_pixels(&self, pixels: &Vec>) { + let mut pane1 = [0u8; 640]; + for x in 0..7 { + pane1[x] = PANE1_HEADER[x]; + } + for (r, (index, width)) in PANE1_ROWS.iter().enumerate() { + for x in 0..*width { + pane1[index + x] = pixels[r][x]; + } + } + + let mut pane2 = [0u8; 640]; + for x in 0..7 { + pane2[x] = PANE2_HEADER[x]; } + for (r, (index, width)) in PANE2_ROWS.iter().enumerate() { + let x_offset = if r == 0 { PANE2_X_OFFSET } else { 0 }; + for x in 0..*width { + pane2[index + x] = pixels[r + PANE2_Y_OFFSET][x + x_offset]; + } + } + + self.send(&pane1); + self.send(&pane2); + self.send(&FLUSH); } - send(&pane1, &device_handle, &timeout); - send(&pane2, &device_handle, &timeout); - send(&FLUSH, &device_handle, &timeout); -} + pub fn new() -> Option { + // let tick = Duration::new(0, 500 * 1000000); + // let timeout = Duration::new(5, 0); -pub fn usb() { - // let tick = Duration::new(0, 500 * 1000000); - let timeout = Duration::new(5, 0); + for device in rusb::devices().unwrap().iter() { + let device_desc = device.device_descriptor().unwrap(); - for device in rusb::devices().unwrap().iter() { - let device_desc = device.device_descriptor().unwrap(); + if device_desc.vendor_id() == VENDOR_ID && device_desc.product_id() == PRODUCT_ID { + let mut device_handle = device.open().unwrap(); // sends GET_DESCRIPTOR_FROM_DEVICE x2 - if device_desc.vendor_id() == VENDOR_ID && device_desc.product_id() == PRODUCT_ID { - let mut device_handle = device.open().unwrap(); // sends GET_DESCRIPTOR_FROM_DEVICE x2 + // This device has 1 config, 1 interface, 1 endpoint. + let config = device.active_config_descriptor().unwrap(); + let interface = config.interfaces().next().unwrap(); - // This device has 1 config, 1 interface, 1 endpoint. - let config = device.active_config_descriptor().unwrap(); - let interface = config.interfaces().next().unwrap(); + // device_handle.reset().unwrap(); - // device_handle.reset().unwrap(); + device_handle.claim_interface(interface.number()).unwrap(); - device_handle.claim_interface(interface.number()).unwrap(); + let matrix = Matrix { + device_handle, + timeout: Duration::new(5, 0), + }; - send(&INIT_HEADER, &device_handle, &timeout); - // send(&INIT_01, &device_handle, &timeout); - // send(&INIT_02, &device_handle, &timeout); + matrix.send(&INIT_HEADER); + // send(&INIT_01, &device_handle, &timeout); + // send(&INIT_02, &device_handle, &timeout); - for buf in [INIT1, INIT2, INIT3].iter() { - send(buf, &device_handle, &timeout); - } + for buf in [INIT1, INIT2, INIT3].iter() { + matrix.send(buf); + } - let mut widths = vec![]; - for (_index, width) in PANE1_ROWS.iter() { - widths.push(*width); - } - for (r, (_index, width)) in PANE2_ROWS.iter().enumerate() { - let last_width = if r == 0 { widths.pop().unwrap() } else { 0 }; - widths.push(last_width + width); - } - let mut pixels = vec![]; - for width in widths { - let mut row = vec![0u8; width]; - row[0] = 255; - row[width - 1] = 255; - pixels.push(row); - } + // let mut widths = vec![]; + // for (_index, width) in PANE1_ROWS.iter() { + // widths.push(*width); + // } + // for (r, (_index, width)) in PANE2_ROWS.iter().enumerate() { + // let last_width = if r == 0 { widths.pop().unwrap() } else { 0 }; + // widths.push(last_width + width); + // } + // let mut pixels = vec![]; + // for width in widths { + // let mut row = vec![0u8; width]; + // row[0] = 255; + // row[width - 1] = 255; + // pixels.push(row); + // } + + // matrix.send_pixels(&pixels); - send_pixels(pixels, &device_handle, &timeout); + return Some(matrix); + } } + + None } } diff --git a/src/server.rs b/src/server.rs index 76bfc8d..b837f64 100644 --- a/src/server.rs +++ b/src/server.rs @@ -1,7 +1,10 @@ use serde::Deserialize; +use rocket::State; use rocket_contrib::json::Json; use rocket_contrib::serve::StaticFiles; +use super::matrix::Matrix; + #[derive(Deserialize)] struct Data { @@ -9,12 +12,13 @@ struct Data { } #[post("/post", format = "json", data = "")] -fn post(data: Json) -> () { - println!("{:?}", data.rows); +fn post(data: Json, matrix: State) -> () { + matrix.send_pixels(&data.rows); } -pub fn start() { +pub fn start(matrix: Matrix) { rocket::ignite() + .manage(matrix) .mount("/", StaticFiles::from("web")) .mount("/", routes![post]) .launch(); diff --git a/web/web.js b/web/web.js index 65f79f7..4f1be62 100644 --- a/web/web.js +++ b/web/web.js @@ -10,9 +10,10 @@ const widths = [ 26, 26, 25, 25, 24, 24, 23, 23, 22, 22, 21, 21, 20, 20, 19, 19, 18, 18, 17, 17, 16, 16, 15, 15, 14, 14, 13, 13, 12, 12, 11, 11, 10, 10, 9, 9, ]; -const size = 10; -const canvaswidth = (Math.max(...widths) + 0.5) * size; -const canvasheight = ((widths.length / 2) + 0.5) * size; +const xsize = 30; +const ysize = 20; +const canvaswidth = (Math.max(...widths) + 0.5) * xsize; +const canvasheight = ((widths.length / 2) + 0.5) * ysize; grid.setAttribute('viewBox', `0 0 ${canvaswidth} ${canvasheight}`); @@ -22,7 +23,7 @@ const map = {}; const drawDiamond = (x, y) => { const poly = document.createElementNS(ns, 'polygon'); - const ox = x + (y % 2 ? 0.5 : 0); + const ox = x + (y % 2 ? 0 : 0.5); const oy = y / 2; poly.setAttribute('points', [ @@ -31,7 +32,7 @@ const drawDiamond = (x, y) => { [ox + 0.5, oy + 1], [ox, oy + 0.5], ] - .map(point => point.map(v => v * size).join(',')) + .map(([px, py]) => [px * xsize, py * ysize].join(',')) .join(' ')); poly.setAttribute('fill', '#000000'); grid.appendChild(poly); @@ -52,8 +53,9 @@ const drawDiamond = (x, y) => { widths.forEach((width, y) => { for (let x = 0; x < width; x++) { - // Shift thr first row right by one. - map[`${x},${y}`] = drawDiamond(y === 0 ? x + 1 : x, y); + // Shift the first row left by one. + const offset = 33 - width - (y === 0 ? 1 : 0); + map[`${x},${y}`] = drawDiamond(offset + x, y); } });