From 02d4bae99762fe151228fc210b9f1dead5393473 Mon Sep 17 00:00:00 2001 From: Sean Sube Date: Wed, 18 Jun 2025 20:31:10 -0500 Subject: [PATCH] improve printer format, reduce some logs --- server/scripts/print-image.ts | 35 ++++++++++++++++++ server/scripts/tux.png | Bin 0 -> 5198 bytes server/src/db/repositories/step-repository.ts | 6 +-- server/src/index.ts | 9 +++-- server/src/printer/command-executor.ts | 4 +- server/src/printer/serial-printer.ts | 15 ++++---- 6 files changed, 53 insertions(+), 16 deletions(-) create mode 100644 server/scripts/print-image.ts create mode 100644 server/scripts/tux.png diff --git a/server/scripts/print-image.ts b/server/scripts/print-image.ts new file mode 100644 index 0000000..0f85ed0 --- /dev/null +++ b/server/scripts/print-image.ts @@ -0,0 +1,35 @@ +import { Image, Printer } from "@node-escpos/core"; +import USB from "@node-escpos/usb-adapter"; +import { join } from "path"; + +async function printImage(path: string) { + const device = new USB(); + await new Promise((resolve,reject) => { + device.open(async function(err){ + if(err){ + reject(err); + return + } + + let printer = new Printer(device, {}); + + const tux = path; // join(__dirname, '../assets/tux.png'); + const image = await Image.load(tux); + + // inject image to printer + printer = await printer.image(image, "d24") + + printer + .cut() + .close() + .finally(resolve) + }); + }); +} + +console.log(process.argv); + +printImage(process.argv[2] || join(__dirname, 'tux.png')) + .then(() => console.log('done')) + .catch((err) => console.error(err)); + diff --git a/server/scripts/tux.png b/server/scripts/tux.png new file mode 100644 index 0000000000000000000000000000000000000000..e32f8d945345480f7bdd85354b48bbd84dcb4f0e GIT binary patch literal 5198 zcmV-U6tU}xP)004R>004l5008;`004mK004C`008P>0026e000+ooVrmw00002 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 literal 0 HcmV?d00001 diff --git a/server/src/db/repositories/step-repository.ts b/server/src/db/repositories/step-repository.ts index 314b094..5732796 100644 --- a/server/src/db/repositories/step-repository.ts +++ b/server/src/db/repositories/step-repository.ts @@ -14,11 +14,11 @@ export class StepRepository extends BaseRepository { .orderBy('order') .select('*'); - logger.info(`Retrieved ${steps.length} steps for task ${taskId}`); + /*logger.info(`Retrieved ${steps.length} steps for task ${taskId}`); for (const step of steps) { logger.info(`Step ${step.id}: name="${step.name}", instructions="${step.instructions}"`); logger.info(`Full step data:`, JSON.stringify(step, null, 2)); - } + }*/ return steps; } @@ -63,4 +63,4 @@ export class StepRepository extends BaseRepository { return steps.findIndex(s => s.id === stepId) + 1; } -} \ No newline at end of file +} diff --git a/server/src/index.ts b/server/src/index.ts index 3a13ac2..975bf5c 100644 --- a/server/src/index.ts +++ b/server/src/index.ts @@ -60,13 +60,14 @@ async function startServer() { // YAML Import endpoint app.post('/api/yaml/import', async (req, res) => { try { - const { yamlContent } = req.body; + const yamlContent = req.body; + console.log('loading YAML:', yamlContent); - if (!yamlContent || typeof yamlContent !== 'string') { + if (!yamlContent || typeof yamlContent !== 'object') { return res.status(400).json({ error: 'YAML content is required' }); } - await yamlService.importFromYaml(yamlContent); + await yamlService.importFromYaml(JSON.stringify(yamlContent)); res.json({ message: 'Database imported successfully' }); } catch (error) { logger.error('Error importing YAML:', error); @@ -101,4 +102,4 @@ async function startServer() { startServer().catch((error) => { logger.error('Failed to start server:', error); process.exit(1); -}); \ No newline at end of file +}); diff --git a/server/src/printer/command-executor.ts b/server/src/printer/command-executor.ts index 5a1fefe..431a46e 100644 --- a/server/src/printer/command-executor.ts +++ b/server/src/printer/command-executor.ts @@ -126,7 +126,9 @@ export class SerialCommandExecutor implements CommandExecutor { break; case Command.CHECKBOX: - await this.printer.text(formatUtils.getCheckboxText(formatUtils.checkbox(params[0] as string))); + const text = params[0] as string; + const checkbox = `[ ] ${text}`; + await this.printer.text(checkbox); break; case Command.LIST: diff --git a/server/src/printer/serial-printer.ts b/server/src/printer/serial-printer.ts index 7c2d9bf..d70ed82 100644 --- a/server/src/printer/serial-printer.ts +++ b/server/src/printer/serial-printer.ts @@ -5,7 +5,7 @@ import { StepRepository, PrintHistoryRepository } from '../db/repositories'; import { Knex } from 'knex'; import logger from '../logger'; import { formatUtils } from './format-utils'; -import { CommandBuilder } from './printer-commands'; +import { Command, CommandBuilder } from './printer-commands'; import { SerialCommandExecutor } from './command-executor'; import { PRINTER_CONFIG, @@ -111,17 +111,15 @@ export class SerialPrinter implements PrinterInterface { const step = taskSteps[i]; logger.info(`Printing step ${step.id}: name="${step.name}", instructions="${step.instructions}"`); - const headerText = formatUtils.getCheckboxText(formatUtils.stepHeader(step.name, i + 1, task.name, true)); commands.push( CommandBuilder.fontSize(FONT_SIZES.NORMAL), - CommandBuilder.text(headerText), - ...formatUtils.section( - '', + formatUtils.stepHeader(step.name, i + 1, task.name, true), + CommandBuilder.banner('-', PAPER_CONFIG.BANNER_LENGTH), + CommandBuilder.text( step.instructions || 'No instructions provided', - '-' ), CommandBuilder.newline(), - ...CommandBuilder.stepBarcodeWithAlignment(step.id), + // ...CommandBuilder.stepBarcodeWithAlignment(step.id), CommandBuilder.newline() ); } @@ -170,7 +168,8 @@ export class SerialPrinter implements PrinterInterface { CommandBuilder.align(ALIGNMENT.CENTER), CommandBuilder.style(STYLE.BOLD), CommandBuilder.fontSize(FONT_SIZES.NORMAL), - CommandBuilder.text(headerText), + formatUtils.stepHeader(step.name, stepNumber, task?.name), + // CommandBuilder.text(headerText), CommandBuilder.newline(), CommandBuilder.align(ALIGNMENT.LEFT), CommandBuilder.fontSize(FONT_SIZES.NORMAL),