use crate::models::print_sections::{Beep, Cut, Drawer, Feed};
pub const CUT_MODE_PARTIAL: u8 = 65;
pub const CUT_MODE_FULL: u8 = 66;
pub const POST_PRINT_FEED_LINES: u8 = 5;
pub struct PrinterControl;
impl PrinterControl {
pub fn initialize() -> Vec<u8> {
vec![0x1B, 0x40]
}
pub fn line_feed_multiple(lines: usize) -> Vec<u8> {
vec![0x0A; lines]
}
pub fn line_feed() -> Vec<u8> {
vec![0x0A]
}
pub fn feed_paper(lines: u8) -> Vec<u8> {
vec![0x1B, 0x64, lines]
}
pub fn feed_paper_dots(dots: u8) -> Vec<u8> {
vec![0x1B, 0x4A, dots]
}
pub fn cut_paper_with_feed(mode: u8, feed_lines: u8) -> Vec<u8> {
vec![0x1D, 0x56, mode, feed_lines]
}
pub fn open_cash_drawer_pin2(pulse_time: u16) -> Vec<u8> {
let mut t = pulse_time / 2; if t > 255 {
t = 255;
}
vec![0x1B, 0x70, 0x00, t as u8, t as u8]
}
pub fn open_cash_drawer_pin5(pulse_time: u16) -> Vec<u8> {
let mut t = pulse_time / 2;
if t > 255 {
t = 255;
}
vec![0x1B, 0x70, 0x01, t as u8, t as u8]
}
pub fn process_feed(feed: &Feed) -> Result<Vec<u8>, String> {
match feed.feed_type.as_str() {
"lines" => Ok(Self::feed_paper(feed.value)),
"dots" => Ok(Self::feed_paper_dots(feed.value)),
"line_feed" => Ok(Self::line_feed_multiple(feed.value as usize)),
_ => Err("Unknown feed type".to_string()),
}
}
pub fn process_cut(cut: &Cut, cut_paper_enabled: bool) -> Result<Vec<u8>, String> {
if !cut_paper_enabled {
return Ok(Self::line_feed_multiple(8));
}
let mode = match cut.mode.as_str() {
"full" | "partial_alt2" => CUT_MODE_FULL,
_ => CUT_MODE_PARTIAL,
};
Ok(Self::cut_paper_with_feed(mode, cut.feed))
}
pub fn process_beep(beep: &Beep, beep_enabled: bool) -> Result<Vec<u8>, String> {
if !beep_enabled {
return Ok(Vec::new());
}
let times = if beep.times == 0 { 1 } else { beep.times };
let duration = if beep.duration == 0 { 100 } else { beep.duration };
Ok(Self::beep_custom(times, duration))
}
pub fn process_drawer(drawer: &Drawer) -> Result<Vec<u8>, String> {
if drawer.pin == 2 {
Ok(Self::open_cash_drawer_pin2(drawer.pulse_time))
} else {
Ok(Self::open_cash_drawer_pin5(drawer.pulse_time))
}
}
pub fn beep_custom(count: u8, duration: u8) -> Vec<u8> {
let count = count.clamp(1, 9);
let duration = duration.clamp(1, 9);
vec![
0x1B, 0x28, 0x41, 0x05, 0x00, 0x61, count, duration, ]
}
}