mirror of
https://github.com/kaesaecracker/servicepoint-simulator.git
synced 2025-01-30 17:20:13 +01:00
remove shared code, fix bugs
This commit is contained in:
parent
acbe9de219
commit
05c7b4cb71
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -1,3 +0,0 @@
|
||||||
[submodule "pixel-shared-rs"]
|
|
||||||
path = pixel-shared-rs
|
|
||||||
url = https://github.com/kaesaecracker/pixel-shared-rs.git
|
|
17
Cargo.lock
generated
17
Cargo.lock
generated
|
@ -1281,9 +1281,9 @@ checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num"
|
name = "num"
|
||||||
version = "0.4.2"
|
version = "0.4.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "3135b08af27d103b0a51f2ae0f8632117b7b185ccf931445affa8df530576a41"
|
checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"num-bigint",
|
"num-bigint",
|
||||||
"num-complex",
|
"num-complex",
|
||||||
|
@ -1561,19 +1561,12 @@ dependencies = [
|
||||||
"env_logger",
|
"env_logger",
|
||||||
"image",
|
"image",
|
||||||
"log",
|
"log",
|
||||||
"pixel-shared-rs",
|
|
||||||
"pixels",
|
|
||||||
"raw-window-handle 0.6.1",
|
|
||||||
"winit",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "pixel-shared-rs"
|
|
||||||
version = "0.1.0"
|
|
||||||
dependencies = [
|
|
||||||
"num",
|
"num",
|
||||||
"num-derive",
|
"num-derive",
|
||||||
"num-traits",
|
"num-traits",
|
||||||
|
"pixels",
|
||||||
|
"raw-window-handle 0.6.1",
|
||||||
|
"winit",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
|
|
@ -12,4 +12,6 @@ winit = { version = "0.30", features = ["rwh_05"] }
|
||||||
log = "0.4"
|
log = "0.4"
|
||||||
raw-window-handle = "0.6"
|
raw-window-handle = "0.6"
|
||||||
env_logger = "0.11"
|
env_logger = "0.11"
|
||||||
pixel-shared-rs = { path = "pixel-shared-rs" }
|
num = "0.4"
|
||||||
|
num-derive = "0.4"
|
||||||
|
num-traits = "0.2"
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 6e46694d877faa61647fae104afe6603c1718a06
|
|
|
@ -1,6 +1,6 @@
|
||||||
|
use crate::protocol::{PIXEL_HEIGHT, PIXEL_WIDTH};
|
||||||
use crate::DISPLAY;
|
use crate::DISPLAY;
|
||||||
use log::{debug, warn};
|
use log::{trace, warn};
|
||||||
use pixel_shared_rs::{PIXEL_HEIGHT, PIXEL_WIDTH};
|
|
||||||
use pixels::wgpu::TextureFormat;
|
use pixels::wgpu::TextureFormat;
|
||||||
use pixels::{Pixels, PixelsBuilder, SurfaceTexture};
|
use pixels::{Pixels, PixelsBuilder, SurfaceTexture};
|
||||||
use winit::application::ApplicationHandler;
|
use winit::application::ApplicationHandler;
|
||||||
|
@ -40,7 +40,7 @@ impl ApplicationHandler for App {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn window_event(&mut self, event_loop: &ActiveEventLoop, _: WindowId, event: WindowEvent) {
|
fn window_event(&mut self, event_loop: &ActiveEventLoop, _: WindowId, event: WindowEvent) {
|
||||||
debug!("event {:?}", event);
|
trace!("event {:?}", event);
|
||||||
match event {
|
match event {
|
||||||
WindowEvent::CloseRequested => {
|
WindowEvent::CloseRequested => {
|
||||||
warn!("The close button was pressed; stopping");
|
warn!("The close button was pressed; stopping");
|
||||||
|
@ -64,8 +64,6 @@ impl ApplicationHandler for App {
|
||||||
i += 1;
|
i += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
debug!("drawn {} pixels", i);
|
|
||||||
|
|
||||||
pixels.render().expect("could not render");
|
pixels.render().expect("could not render");
|
||||||
window.request_redraw();
|
window.request_redraw();
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
|
|
||||||
mod gui;
|
mod gui;
|
||||||
mod upd_loop;
|
mod upd_loop;
|
||||||
|
mod protocol;
|
||||||
|
|
||||||
use std::default::Default;
|
use std::default::Default;
|
||||||
use std::sync::mpsc;
|
use std::sync::mpsc;
|
||||||
|
@ -10,12 +11,12 @@ use crate::gui::App;
|
||||||
use crate::upd_loop::start_udp_thread;
|
use crate::upd_loop::start_udp_thread;
|
||||||
use clap::Parser;
|
use clap::Parser;
|
||||||
use log::info;
|
use log::info;
|
||||||
use pixel_shared_rs::PIXEL_COUNT;
|
use protocol::PIXEL_COUNT;
|
||||||
use winit::event_loop::{ControlFlow, EventLoop};
|
use winit::event_loop::{ControlFlow, EventLoop};
|
||||||
|
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
struct Cli {
|
struct Cli {
|
||||||
#[arg(long = "bind", default_value = "0.0.0.0:2342")]
|
#[arg(long, default_value = "0.0.0.0:2342")]
|
||||||
bind: String,
|
bind: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
99
src/protocol.rs
Normal file
99
src/protocol.rs
Normal file
|
@ -0,0 +1,99 @@
|
||||||
|
use num_derive::{FromPrimitive, ToPrimitive};
|
||||||
|
use std::mem::size_of;
|
||||||
|
|
||||||
|
#[derive(Debug, FromPrimitive, ToPrimitive, Default)]
|
||||||
|
pub enum DisplayCommand {
|
||||||
|
#[default]
|
||||||
|
CmdClear = 0x0002,
|
||||||
|
CmdCp437data = 0x0003,
|
||||||
|
CmdCharBrightness = 0x0005,
|
||||||
|
CmdBrightness = 0x0007,
|
||||||
|
CmdHardReset = 0x000b,
|
||||||
|
CmdFadeOut = 0x000d,
|
||||||
|
CmdBitmapLegacy = 0x0010,
|
||||||
|
CmdBitmapLinear = 0x0012,
|
||||||
|
CmdBitmapLinearWin = 0x0013,
|
||||||
|
CmdBitmapLinearAnd = 0x0014,
|
||||||
|
CmdBitmapLinearOr = 0x0015,
|
||||||
|
CmdBitmapLinearXor = 0x0016,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[repr(C)]
|
||||||
|
#[derive(Debug, Default)]
|
||||||
|
pub struct HdrWindow {
|
||||||
|
pub command: DisplayCommand,
|
||||||
|
pub x: u16,
|
||||||
|
pub y: u16,
|
||||||
|
pub w: u16,
|
||||||
|
pub h: u16,
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
#[repr(C)]
|
||||||
|
pub struct HdrBitmap {
|
||||||
|
pub command: DisplayCommand,
|
||||||
|
pub offset: u16,
|
||||||
|
pub length: u16,
|
||||||
|
pub subcommand: DisplaySubcommand,
|
||||||
|
reserved: u16,
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
|
||||||
|
#[repr(u16)]
|
||||||
|
#[derive(Debug, FromPrimitive, ToPrimitive)]
|
||||||
|
pub enum DisplaySubcommand {
|
||||||
|
SubCmdBitmapNormal = 0x0,
|
||||||
|
SubCmdBitmapCompressZ = 0x677a,
|
||||||
|
SubCmdBitmapCompressBz = 0x627a,
|
||||||
|
SubCmdBitmapCompressLz = 0x6c7a,
|
||||||
|
SubCmdBitmapCompressZs = 0x7a73,
|
||||||
|
}
|
||||||
|
|
||||||
|
pub const TILE_SIZE: u16 = 8;
|
||||||
|
pub const TILE_WIDTH: u16 = 56;
|
||||||
|
pub const TILE_HEIGHT: u16 = 20;
|
||||||
|
pub const PIXEL_WIDTH: u16 = TILE_WIDTH * TILE_SIZE;
|
||||||
|
pub const PIXEL_HEIGHT: u16 = TILE_HEIGHT * TILE_SIZE;
|
||||||
|
pub const PIXEL_COUNT: usize = PIXEL_WIDTH as usize * PIXEL_HEIGHT as usize;
|
||||||
|
|
||||||
|
#[derive(Debug)]
|
||||||
|
pub enum ReadHeaderError {
|
||||||
|
BufferTooSmall,
|
||||||
|
WrongCommandEndianness(u16, DisplayCommand),
|
||||||
|
InvalidCommand(u16),
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn read_header(buffer: &[u8]) -> Result<HdrWindow, ReadHeaderError> {
|
||||||
|
if buffer.len() < size_of::<HdrWindow>() {
|
||||||
|
return Err(ReadHeaderError::BufferTooSmall);
|
||||||
|
}
|
||||||
|
|
||||||
|
let command_u16 = read_beu16(&buffer[0..=1]);
|
||||||
|
return match num::FromPrimitive::from_u16(command_u16) {
|
||||||
|
Some(command) => Ok(HdrWindow {
|
||||||
|
command,
|
||||||
|
x: read_beu16(&buffer[2..=3]),
|
||||||
|
y: read_beu16(&buffer[4..=5]),
|
||||||
|
w: read_beu16(&buffer[6..=7]),
|
||||||
|
h: read_beu16(&buffer[8..=9]),
|
||||||
|
}),
|
||||||
|
None => {
|
||||||
|
let maybe_command: Option<DisplayCommand> =
|
||||||
|
num::FromPrimitive::from_u16(u16::swap_bytes(command_u16));
|
||||||
|
return match maybe_command {
|
||||||
|
None => Err(ReadHeaderError::InvalidCommand(command_u16)),
|
||||||
|
Some(command) => Err(ReadHeaderError::WrongCommandEndianness(
|
||||||
|
command_u16,
|
||||||
|
command,
|
||||||
|
)),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn read_beu16(buffer: &[u8]) -> u16 {
|
||||||
|
let buffer: [u8; 2] = buffer
|
||||||
|
.try_into()
|
||||||
|
.expect("cannot read u16 from buffer with size != 2");
|
||||||
|
return u16::from_be_bytes(buffer);
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
use crate::DISPLAY;
|
use crate::protocol::{
|
||||||
use log::{error, info, warn};
|
|
||||||
use pixel_shared_rs::{
|
|
||||||
read_header, DisplayCommand, HdrWindow, ReadHeaderError, PIXEL_WIDTH, TILE_SIZE,
|
read_header, DisplayCommand, HdrWindow, ReadHeaderError, PIXEL_WIDTH, TILE_SIZE,
|
||||||
};
|
};
|
||||||
|
use crate::DISPLAY;
|
||||||
|
use log::{error, info, warn};
|
||||||
use std::io::ErrorKind;
|
use std::io::ErrorKind;
|
||||||
use std::mem::size_of;
|
use std::mem::size_of;
|
||||||
use std::net::UdpSocket;
|
use std::net::UdpSocket;
|
||||||
|
@ -109,7 +109,7 @@ fn check_payload_size(buf: &[u8], expected: usize) -> bool {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn print_bitmap_linear_win(header: &HdrWindow, payload: &[u8]) {
|
fn print_bitmap_linear_win(header: &HdrWindow, payload: &[u8]) {
|
||||||
if !check_payload_size(payload, (header.w * header.h) as usize) {
|
if !check_payload_size(payload, header.w as usize * header.h as usize) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -118,19 +118,15 @@ fn print_bitmap_linear_win(header: &HdrWindow, payload: &[u8]) {
|
||||||
header.x, header.y
|
header.x, header.y
|
||||||
);
|
);
|
||||||
|
|
||||||
let mut text_repr = String::new();
|
|
||||||
|
|
||||||
for y in 0..header.h {
|
for y in 0..header.h {
|
||||||
for byte_x in 0..header.w {
|
for byte_x in 0..header.w {
|
||||||
let byte_index = (y * header.w + byte_x) as usize;
|
let byte_index = (y * header.w + byte_x) as usize;
|
||||||
let byte = payload[byte_index];
|
let byte = payload[byte_index];
|
||||||
|
|
||||||
for pixel_x in 1u8..=8u8 {
|
for pixel_x in 0u8..8u8 {
|
||||||
let bit_index = 8 - pixel_x;
|
let bit_index = 7 - pixel_x;
|
||||||
let bitmask = 1 << bit_index;
|
let bitmask = 1 << bit_index;
|
||||||
let is_set = byte & bitmask != 0;
|
let is_set = byte & bitmask != 0;
|
||||||
let char = if is_set { '█' } else { ' ' };
|
|
||||||
text_repr.push(char);
|
|
||||||
|
|
||||||
let x = byte_x * TILE_SIZE + pixel_x as u16;
|
let x = byte_x * TILE_SIZE + pixel_x as u16;
|
||||||
|
|
||||||
|
@ -143,10 +139,7 @@ fn print_bitmap_linear_win(header: &HdrWindow, payload: &[u8]) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
text_repr.push('\n');
|
|
||||||
}
|
}
|
||||||
info!("{}", text_repr);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: actually convert from CP437
|
// TODO: actually convert from CP437
|
||||||
|
|
Loading…
Reference in a new issue