Skip to content

Commit ca1b8ac

Browse files
Merge pull request #12 from FrameworkComputer/workspaces-b1display
2 parents 6d399b7 + 5949087 commit ca1b8ac

File tree

2 files changed

+70
-16
lines changed

2 files changed

+70
-16
lines changed

Cargo.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

lotus-inputmodules/src/control.rs

Lines changed: 69 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ use crate::graphics::*;
77
#[cfg(feature = "b1display")]
88
use core::fmt::{Debug, Write};
99
#[cfg(feature = "b1display")]
10+
use embedded_graphics::Pixel;
11+
#[cfg(feature = "b1display")]
1012
use embedded_graphics::{
1113
pixelcolor::Rgb565,
1214
prelude::{Point, RgbColor},
@@ -50,6 +52,8 @@ pub enum _CommandVals {
5052
SetColor = 0x13,
5153
DisplayOn = 0x14,
5254
InvertScreen = 0x15,
55+
SetPixelColumn = 0x16,
56+
FlushFramebuffer = 0x17,
5357
Version = 0x20,
5458
}
5559

@@ -117,6 +121,8 @@ pub enum Command {
117121
SetColor(RGB8),
118122
DisplayOn(bool),
119123
InvertScreen(bool),
124+
SetPixelColumn(usize, [u8; 50]),
125+
FlushFramebuffer,
120126
_Unknown,
121127
}
122128

@@ -243,29 +249,49 @@ pub fn parse_module_command(count: usize, buf: &[u8]) -> Option<Command> {
243249

244250
#[cfg(feature = "b1display")]
245251
pub fn parse_module_command(count: usize, buf: &[u8]) -> Option<Command> {
246-
if count >= 4 && buf[0] == 0x32 && buf[1] == 0xAC {
252+
if count >= 3 && buf[0] == 0x32 && buf[1] == 0xAC {
247253
let command = buf[2];
248-
let arg = buf[3];
254+
let arg = if count <= 3 { None } else { Some(buf[3]) };
249255

250256
match command {
251257
0x09 => {
252-
let available_len = count - 4;
253-
let str_len = arg as usize;
254-
assert!(str_len <= available_len);
258+
if let Some(arg) = arg {
259+
let available_len = count - 4;
260+
let str_len = arg as usize;
261+
assert!(str_len <= available_len);
255262

256-
assert!(str_len < 32);
257-
let mut bytes = [0; 32];
258-
bytes[..str_len].copy_from_slice(&buf[4..4 + str_len]);
263+
assert!(str_len < 32);
264+
let mut bytes = [0; 32];
265+
bytes[..str_len].copy_from_slice(&buf[4..4 + str_len]);
259266

260-
let text_str = core::str::from_utf8(&bytes[..str_len]).unwrap();
261-
let mut text: String<64> = String::new();
262-
writeln!(&mut text, "{}", text_str).unwrap();
267+
let text_str = core::str::from_utf8(&bytes[..str_len]).unwrap();
268+
let mut text: String<64> = String::new();
269+
writeln!(&mut text, "{}", text_str).unwrap();
263270

264-
Some(Command::SetText(text))
271+
Some(Command::SetText(text))
272+
} else {
273+
None
274+
}
265275
}
266-
0x14 => Some(Command::DisplayOn(arg == 1)),
267-
0x15 => Some(Command::InvertScreen(arg == 1)),
268-
_ => None,
276+
0x14 => Some(Command::DisplayOn(arg == Some(1))),
277+
0x15 => Some(Command::InvertScreen(arg == Some(1))),
278+
0x16 => {
279+
// 3B for magic and command
280+
// 2B for column (u16)
281+
// 50B for 400 pixels (400/8=50)
282+
if count == 3 + 2 + 50 {
283+
let column = u16::from_le_bytes([buf[3], buf[4]]);
284+
//panic!("SetPixelColumn. Col: {}", column);
285+
let mut pixels: [u8; 50] = [0; 50];
286+
pixels.clone_from_slice(&buf[5..55]);
287+
Some(Command::SetPixelColumn(column as usize, pixels))
288+
} else {
289+
panic!("Failed to parse SetPixelColumn. count: {}", count);
290+
None
291+
}
292+
}
293+
0x17 => Some(Command::FlushFramebuffer),
294+
_ => panic!("Invalid command: {command}"),
269295
}
270296
} else {
271297
None
@@ -453,6 +479,34 @@ where
453479
}
454480
None
455481
}
482+
Command::SetPixelColumn(column, pixel_bytes) => {
483+
let mut pixels: [bool; 400] = [false; 400];
484+
for (i, byte) in pixel_bytes.iter().enumerate() {
485+
pixels[8 * i + 0] = byte & 0b00000001 != 0;
486+
pixels[8 * i + 1] = byte & 0b00000010 != 0;
487+
pixels[8 * i + 2] = byte & 0b00000100 != 0;
488+
pixels[8 * i + 3] = byte & 0b00001000 != 0;
489+
pixels[8 * i + 4] = byte & 0b00010000 != 0;
490+
pixels[8 * i + 5] = byte & 0b00100000 != 0;
491+
pixels[8 * i + 6] = byte & 0b01000000 != 0;
492+
pixels[8 * i + 7] = byte & 0b10000000 != 0;
493+
}
494+
disp.draw_pixels(
495+
pixels.iter().enumerate().map(|(y, black)| {
496+
Pixel(
497+
Point::new(*column as i32, y as i32),
498+
if *black { Rgb565::BLACK } else { Rgb565::WHITE },
499+
)
500+
}),
501+
false,
502+
)
503+
.unwrap();
504+
None
505+
}
506+
Command::FlushFramebuffer => {
507+
disp.flush();
508+
None
509+
}
456510
_ => handle_generic_command(command),
457511
}
458512
}

0 commit comments

Comments
 (0)