From 5245ae176a92c44774a89e9ddf70010ed8ba8faf Mon Sep 17 00:00:00 2001 From: Nathan Singer Date: Thu, 21 Aug 2025 22:58:56 -0400 Subject: [PATCH] init commit --- Makefile | 24 ++++++++++++++ build/receipt-printer | Bin 0 -> 21128 bytes build/src/main.c.o | Bin 0 -> 8224 bytes build/src/printer.c.o | Bin 0 -> 6352 bytes src/main.c | 73 ++++++++++++++++++++++++++++++++++++++++++ src/printer.c | 49 ++++++++++++++++++++++++++++ src/printer.h | 26 +++++++++++++++ 7 files changed, 172 insertions(+) create mode 100644 Makefile create mode 100755 build/receipt-printer create mode 100644 build/src/main.c.o create mode 100644 build/src/printer.c.o create mode 100644 src/main.c create mode 100644 src/printer.c create mode 100644 src/printer.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..2dc6fad --- /dev/null +++ b/Makefile @@ -0,0 +1,24 @@ +CC=gcc +CFLAGS= -c -g -Wall + +LDLIBS = $(shell pkg-config --libs --cflags libusb-1.0) + +TARGET := receipt-printer + +BUILD_DIR := ./build +SRC_DIRS := ./src + +SRCS := $(shell find $(SRC_DIRS) -name '*.c') + +OBJS := $(SRCS:%=$(BUILD_DIR)/%.o) + +$(BUILD_DIR)/$(TARGET): $(OBJS) + $(CC) $(OBJS) -o $@ $(LDLIBS) + +$(BUILD_DIR)/%.c.o: %.c + mkdir -p $(dir $@) + $(CC) $(CFLAGS) -c $< -o $@ + +.PHONY: clean +clean: + rm -rf $(BUILD_DIR) diff --git a/build/receipt-printer b/build/receipt-printer new file mode 100755 index 0000000000000000000000000000000000000000..4c978a80cd3a380f9e326c494aa0fb00a164aa32 GIT binary patch literal 21128 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 X4?!z{rv4Zh7(o4Agec^EI%GZo0TQ0Q literal 0 HcmV?d00001 diff --git a/build/src/main.c.o b/build/src/main.c.o new file mode 100644 index 0000000000000000000000000000000000000000..b2a9b982f98eddc9b2827884e357fababcfe4a08 GIT binary patch literal 8224 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 F001xMEy@4@ literal 0 HcmV?d00001 diff --git a/build/src/printer.c.o b/build/src/printer.c.o new file mode 100644 index 0000000000000000000000000000000000000000..f7016659a429e12fab25e1df107a76fac94c51b8 GIT binary patch literal 6352 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 literal 0 HcmV?d00001 diff --git a/src/main.c b/src/main.c new file mode 100644 index 0000000..990f34d --- /dev/null +++ b/src/main.c @@ -0,0 +1,73 @@ +#include +#include +#include +#include + +#include "printer.h" + +int main(void) +{ + int err; + bool detached = false; + libusb_device_handle *dev_handler; + + /* Init BEGIN */ + + err = libusb_init_context(NULL, NULL, 0); + if (err != 0) { + perror("LIBUSB Error"); + exit(-1); + } + + + dev_handler = libusb_open_device_with_vid_pid(NULL, + PRINTER_VENDOR_ID, PRINTER_PRODUCT_ID); + + err = libusb_open(libusb_get_device(dev_handler), &dev_handler); + if (err != 0) { + perror("libusb_open"); + exit(-1); + } + + err = libusb_kernel_driver_active(dev_handler, 0); + if (err != 0) { + libusb_detach_kernel_driver(dev_handler, 0); + detached = true; + } + + err = libusb_claim_interface(dev_handler, 0); + if (err != 0) + perror("libusb_claim_interface"); + + /* Init END */ + + + printer_initialize(dev_handler, true); + + printer_feed(dev_handler, 0x10); + + char* str = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccdddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddddd"; + + printer_print(dev_handler, str, strlen(str)); + + printer_feed(dev_handler, 0x10); + + printer_cut(dev_handler, false); + + + /* Cleanup BEGIN */ + + err = libusb_release_interface(dev_handler, 0); + if (err) + perror("libusb_release_interface"); + + if (detached) + libusb_attach_kernel_driver(dev_handler, 0); + + libusb_close(dev_handler); + + + libusb_exit(NULL); + + /* Cleanup END */ +} diff --git a/src/printer.c b/src/printer.c new file mode 100644 index 0000000..c00e5ad --- /dev/null +++ b/src/printer.c @@ -0,0 +1,49 @@ +#include + +#include "printer.h" + +void send_msg(libusb_device_handle* dev_handler, unsigned char* data, size_t len) +{ + int err = libusb_bulk_transfer(dev_handler, PRINTER_ENDPOINT, data, len, NULL, 0); + if (err != 0) + perror("libusb_bulk_transfer"); +} + +void printer_initialize(libusb_device_handle* dev_handler, bool beep) +{ + unsigned char data[2] = {0x1B, 0x40}; // 0x1B 0x40 is printer initialize + + send_msg(dev_handler, data, 2); + + + if (!beep) + return; + + data[1] = 0x07; // 0x1B 0x07 is beep + for (int i = 0; i < 2; i++) + send_msg(dev_handler, data, 2); +} + +void printer_feed(libusb_device_handle* dev_handler, uint8_t lines) +{ + unsigned char data[2] = {0x14, lines}; + + send_msg(dev_handler, data, 2); +} + +void printer_cut(libusb_device_handle* dev_handler, bool partial) +{ + unsigned char data[1] = {0x19}; + if (partial) + data[0] = 0x1A; + + send_msg(dev_handler, data, 1); +} + +void printer_print(libusb_device_handle* dev_handler, char* text, size_t len) +{ + send_msg(dev_handler, (unsigned char*) text, len); + + unsigned char data[1] = {0x17}; + send_msg(dev_handler, data, 1); +} diff --git a/src/printer.h b/src/printer.h new file mode 100644 index 0000000..61abbcf --- /dev/null +++ b/src/printer.h @@ -0,0 +1,26 @@ +#include +#include +#include + +#include + +#ifndef PRINTER_H +#define PRINTER_H + +// would love for this to be cli arguments +#define PRINTER_VENDOR_ID 0x0404 +#define PRINTER_PRODUCT_ID 0x0312 + +#define PRINTER_ENDPOINT 0x02 + +void send_msg(libusb_device_handle* dev_handler, unsigned char* data, size_t len); + +void printer_initialize(libusb_device_handle* dev_handler, bool beep); + +void printer_feed(libusb_device_handle* dev_handler, uint8_t lines); + +void printer_cut(libusb_device_handle* dev_handler, bool partial); + +void printer_print(libusb_device_handle* dev_handler, char* text, size_t len); + +#endif