release: escpos-vfd 0.3.0

This commit is contained in:
Кобелев Андрей Андреевич
2026-08-20 19:25:08 +05:00
parent 244d907cc2
commit 37cdba4898
14 changed files with 472 additions and 69 deletions
+16 -8
View File
@@ -5,7 +5,7 @@
//! функции. Для фоновой сериализации команд из разных частей приложения используйте
//! [`crate::VfdWorker`] или `escpos_vfd::tokio::AsyncVfdWorker`.
use crate::codec::{EpsonCodec, fit_to_width, sanitize_text, truncate_chars};
use crate::codec::{EpsonCodec, fit_to_width, truncate_chars};
use crate::config::{DisplaySettings, VfdConfig};
use crate::error::{Result, VfdError};
use serialport::SerialPort;
@@ -84,7 +84,7 @@ impl<T: Write> Vfd<T> {
/// ```
pub fn from_transport(mut transport: T, display: DisplaySettings) -> Result<Self> {
display.validate()?;
let codec = EpsonCodec::new(display);
let codec = EpsonCodec::new(display)?;
let init = codec.init();
if !init.is_empty() {
transport.write_all(&init)?;
@@ -138,9 +138,8 @@ impl<T: Write> Vfd<T> {
/// Выводит подготовленный кадр с начала строки без предварительной очистки.
///
/// В отличие от [`Vfd::print_line`], метод не выполняет санацию текста. Используйте
/// его для заранее подготовленных кадров бегущей строки или тестовых байтовых
/// сценариев, когда содержимое уже нормализовано вызывающим кодом.
/// В отличие от [`Vfd::print_line`], метод не выполняет типографскую нормализацию до
/// подгонки ширины. Управляющие символы всё равно нейтрализуются на этапе кодирования.
///
/// # Ошибки
///
@@ -161,11 +160,10 @@ impl<T: Write> Vfd<T> {
///
/// Возвращает [`VfdError::InvalidCoordinate`] или [`VfdError::Io`].
pub fn print_at(&mut self, x: u8, y: u8, text: &str) -> Result<()> {
let text = sanitize_text(text);
self.print_at_prepared(x, y, &text)
self.print_at_prepared(x, y, text)
}
/// Печатает уже подготовленный текст без повторной санации.
/// Печатает уже подготовленный текст; управляющие символы нейтрализуются codec-ом.
pub(crate) fn print_at_prepared(&mut self, x: u8, y: u8, text: &str) -> Result<()> {
self.codec.validate_xy(x, y)?;
let remaining = self.columns() - usize::from(x) + 1;
@@ -310,4 +308,14 @@ mod tests {
vec![0x1B, 0x40, 0x1F, 0x24, 1, 1, 0xF2, b' ', b' ', b' ']
);
}
#[test]
fn high_level_text_neutralizes_protocol_controls() {
let display = DisplaySettings::new(8, 1, TextEncoding::Ascii);
let mut vfd = Vfd::from_transport(Vec::<u8>::new(), display).unwrap();
vfd.print_line(1, "A\u{1b}@B\u{0c}C").unwrap();
assert_eq!(&vfd.into_inner()[6..], b"A @B C ");
}
}