From 3cef88d9534af672a695e78e0933ff863d64e1ed Mon Sep 17 00:00:00 2001 From: AmanuDel-diavolo Date: Wed, 14 Jan 2026 23:48:36 +0100 Subject: [PATCH 1/6] Added support for different sizes of tape defined in the .env file, the width has to be inputted in pixels --- brother_ql/src/image.rs | 10 ++++++++-- example.env | 3 ++- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/brother_ql/src/image.rs b/brother_ql/src/image.rs index b4c8519..f376b7f 100644 --- a/brother_ql/src/image.rs +++ b/brother_ql/src/image.rs @@ -1,3 +1,5 @@ +use std::env; + use crate::driver::{PrinterCommand, PrinterCommandMode, PrinterExpandedMode, PrinterMode}; use crate::error::BrotherQlError; use crate::{driver, Settings}; @@ -84,12 +86,15 @@ fn img_to_lines(img: ImageBuffer, Vec>) -> Result, Br let mut lines = Vec::new(); + let new_width: u32 = env::var("WIDTH").unwrap_or("720".to_string()).parse::().unwrap_or(720); + let padding: u32 = 720 - new_width; + for y in 0..img.height() { let mut line = [0u8; 90]; for x in 0..img.width() { let i = img.get_pixel(x, y).0[0]; - + let x = x + padding; let byte = x / 8; let bit = x % 8; @@ -133,7 +138,8 @@ pub fn render_image(file_path: &str, settings: &Settings) -> Result().unwrap_or(5000); //630 per la carta piccola let new_height = new_width * img.height() / img.width() * if settings.dpi_600 { 2 } else { 1 }; diff --git a/example.env b/example.env index b21c108..45d051e 100644 --- a/example.env +++ b/example.env @@ -1,3 +1,4 @@ BOT_TOKEN=999999999:xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxx OWNER_ID=222222222 -RUST_LOG=printer_bot_rs=DEBUG \ No newline at end of file +RUST_LOG=printer_bot_rs=DEBUG +WIDTH=720 \ No newline at end of file From 782d4c606325efc970fe9aac2c6e32511e6434f6 Mon Sep 17 00:00:00 2001 From: Tommaso Fontana Date: Wed, 14 Jan 2026 23:41:24 +0100 Subject: [PATCH 2/6] autodetect paper? --- brother_ql/src/driver.rs | 43 ++++++++++++++++++++++++++++++++++++++++ brother_ql/src/image.rs | 19 ++++++++++-------- 2 files changed, 54 insertions(+), 8 deletions(-) diff --git a/brother_ql/src/driver.rs b/brother_ql/src/driver.rs index ebca72f..37e94b8 100644 --- a/brother_ql/src/driver.rs +++ b/brother_ql/src/driver.rs @@ -119,6 +119,49 @@ pub struct PrinterStatus { phase_state: PhaseState, } +impl PrinterStatus { + /// Get the pixel width (print area width in dots) for the loaded media + pub fn pixel_width(&self) -> Option { + match (self.media_width, self.media_length) { + // Endless tapes (length = 0) + (12, 0) => Some(106), + (18, 0) => Some(234), + (29, 0) => Some(306), + (38, 0) => Some(413), + (50, 0) => Some(554), + (54, 0) => Some(590), + (62, 0) => Some(696), + (102, 0) => Some(1164), + (104, 0) => Some(1200), + + // Die-cut labels + (17, 54) => Some(165), + (17, 87) => Some(165), + (23, 23) => Some(202), + (29, 42) => Some(306), + (29, 90) => Some(306), + (38, 90) => Some(413), + (39, 48) => Some(425), + (52, 29) => Some(578), + (54, 29) => Some(598), + (60, 87) => Some(672), + (62, 29) => Some(696), + (62, 100) => Some(696), + (102, 51) => Some(1164), + (102, 153) => Some(1164), + (104, 164) => Some(1200), + + // Round die-cut labels + (12, 12) => Some(94), + (24, 24) => Some(236), + (58, 58) => Some(618), + + // Unknown media + _ => None, + } + } +} + #[derive(Clone)] pub enum PrinterCommandMode { /// ESC/P mode (normal) diff --git a/brother_ql/src/image.rs b/brother_ql/src/image.rs index f376b7f..96f6998 100644 --- a/brother_ql/src/image.rs +++ b/brother_ql/src/image.rs @@ -60,7 +60,10 @@ fn apply_threshold( Ok(img) } -fn img_to_lines(img: ImageBuffer, Vec>) -> Result, BrotherQlError> { +fn img_to_lines( + img: ImageBuffer, Vec>, + image_width: u32, +) -> Result, BrotherQlError> { // convert to vec of line bits /* let mut lines = Vec::new(); @@ -85,16 +88,14 @@ fn img_to_lines(img: ImageBuffer, Vec>) -> Result, Br */ let mut lines = Vec::new(); - - let new_width: u32 = env::var("WIDTH").unwrap_or("720".to_string()).parse::().unwrap_or(720); - let padding: u32 = 720 - new_width; + let padding = 720 - image_width; for y in 0..img.height() { let mut line = [0u8; 90]; for x in 0..img.width() { let i = img.get_pixel(x, y).0[0]; - let x = x + padding; + let x = x + padding; let byte = x / 8; let bit = x % 8; @@ -139,8 +140,9 @@ pub fn render_image(file_path: &str, settings: &Settings) -> Result().unwrap_or(5000); //630 per la carta piccola - + let mut printer = driver::PrinterCommander::main("/dev/usb/lp0")?; + let status = printer.read_status()?; + let new_width = status.pixel_width().unwrap_or(720) as u32; let new_height = new_width * img.height() / img.width() * if settings.dpi_600 { 2 } else { 1 }; let mut img = image::imageops::resize( @@ -158,7 +160,8 @@ pub fn render_image(file_path: &str, settings: &Settings) -> Result Date: Thu, 15 Jan 2026 00:15:07 +0100 Subject: [PATCH 3/6] fix pixel_width as total_width - offset --- brother_ql/src/driver.rs | 57 ++++++++++++++++++++-------------------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/brother_ql/src/driver.rs b/brother_ql/src/driver.rs index 37e94b8..e9b6e89 100644 --- a/brother_ql/src/driver.rs +++ b/brother_ql/src/driver.rs @@ -123,38 +123,39 @@ impl PrinterStatus { /// Get the pixel width (print area width in dots) for the loaded media pub fn pixel_width(&self) -> Option { match (self.media_width, self.media_length) { - // Endless tapes (length = 0) - (12, 0) => Some(106), - (18, 0) => Some(234), - (29, 0) => Some(306), - (38, 0) => Some(413), - (50, 0) => Some(554), - (54, 0) => Some(590), - (62, 0) => Some(696), - (102, 0) => Some(1164), - (104, 0) => Some(1200), + // Endless tapes (length = 0) - dots_total - offset_r + (12, 0) => Some(142 - 29), // 113 + (18, 0) => Some(256 - 171), // 85 + (29, 0) => Some(342 - 6), // 336 + (38, 0) => Some(449 - 12), // 437 + (50, 0) => Some(590 - 12), // 578 + (54, 0) => Some(636 - 0), // 636 + (62, 0) => Some(732 - 12), // 720 + (102, 0) => Some(1200 - 12), // 1188 + (104, 0) => Some(1224 - 12), // 1212 // Die-cut labels - (17, 54) => Some(165), - (17, 87) => Some(165), - (23, 23) => Some(202), - (29, 42) => Some(306), - (29, 90) => Some(306), - (38, 90) => Some(413), - (39, 48) => Some(425), - (52, 29) => Some(578), - (54, 29) => Some(598), - (60, 87) => Some(672), - (62, 29) => Some(696), - (62, 100) => Some(696), - (102, 51) => Some(1164), - (102, 153) => Some(1164), - (104, 164) => Some(1200), + (17, 54) => Some(201 - 0), // 201 + (17, 87) => Some(201 - 0), // 201 + (23, 23) => Some(272 - 42), // 230 + (29, 42) => Some(342 - 6), // 336 + (29, 90) => Some(342 - 6), // 336 + (38, 90) => Some(449 - 12), // 437 + (39, 48) => Some(461 - 6), // 455 + (52, 29) => Some(614 - 0), // 614 + (54, 29) => Some(630 - 60), // 570 + (60, 87) => Some(708 - 18), // 690 + (62, 29) => Some(732 - 12), // 720 + (62, 100) => Some(732 - 12), // 720 + (102, 51) => Some(1200 - 12), // 1188 + (102, 153) => Some(1200 - 12), // 1188 + (104, 164) => Some(1224 - 12), // 1212 // Round die-cut labels - (12, 12) => Some(94), - (24, 24) => Some(236), - (58, 58) => Some(618), + // This can't be right + //(12, 12) => Some(142 - 113), // 29 + (24, 24) => Some(284 - 42), // 242 + (58, 58) => Some(688 - 51), // 637 // Unknown media _ => None, From f2c94fd509d6340ad0ca487f939cedfc67d04621 Mon Sep 17 00:00:00 2001 From: Tommaso Fontana Date: Wed, 21 Jan 2026 11:29:01 +0100 Subject: [PATCH 4/6] Add StatusInfoRequest to read_status so it doesn't wait forever --- brother_ql/src/driver.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/brother_ql/src/driver.rs b/brother_ql/src/driver.rs index e9b6e89..b0c8a39 100644 --- a/brother_ql/src/driver.rs +++ b/brother_ql/src/driver.rs @@ -299,6 +299,7 @@ impl PrinterCommander { } pub fn read_status(&mut self) -> Result { + self.send_command(PrinterCommand::StatusInfoRequest)?; let res = self.printer.read(32)?; assert!(res[0] == 0x80); assert!(res[1] == 0x20); From e55d7f5c28c611e08389b8de131224db7e61768f Mon Sep 17 00:00:00 2001 From: AmanuDel-diavolo Date: Sun, 8 Feb 2026 22:13:12 +0100 Subject: [PATCH 5/6] switched from system openssl to openssl-src to enable crosscompilation --- Cargo.lock | 11 +++++++++++ printer_bot_rs/Cargo.toml | 1 + 2 files changed, 12 insertions(+) diff --git a/Cargo.lock b/Cargo.lock index 57d07db..6b607ec 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1481,6 +1481,15 @@ version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" +[[package]] +name = "openssl-src" +version = "300.5.5+3.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f1787d533e03597a7934fd0a765f0d28e94ecc5fb7789f8053b1e699a56f709" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" version = "0.9.109" @@ -1489,6 +1498,7 @@ checksum = "90096e2e47630d78b7d1c20952dc621f957103f8bc2c8359ec81290d75238571" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -1626,6 +1636,7 @@ dependencies = [ "dotenvy", "env_logger", "log", + "openssl", "teloxide-core", "thiserror 2.0.16", "tokio", diff --git a/printer_bot_rs/Cargo.toml b/printer_bot_rs/Cargo.toml index 0d9db87..e618e04 100644 --- a/printer_bot_rs/Cargo.toml +++ b/printer_bot_rs/Cargo.toml @@ -11,3 +11,4 @@ log = "0.4.20" teloxide-core = "0.13" thiserror = "2.0.16" tokio = { version = "1.34.0", features = ["full"] } +openssl = { version = "0.10", features = ["vendored"] } From 95101b5f8ee7671e3285d5adbeb63b95fdf0c735 Mon Sep 17 00:00:00 2001 From: Amanuense-del-diavolo Date: Mon, 9 Feb 2026 14:02:40 +0100 Subject: [PATCH 6/6] removed unused line I forgot to remove earlier --- example.env | 1 - 1 file changed, 1 deletion(-) diff --git a/example.env b/example.env index 45d051e..80e1f90 100644 --- a/example.env +++ b/example.env @@ -1,4 +1,3 @@ BOT_TOKEN=999999999:xxxxxxxxxxxxxxx-xxxxxxxxxxxxxxxxxx OWNER_ID=222222222 RUST_LOG=printer_bot_rs=DEBUG -WIDTH=720 \ No newline at end of file