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 0000000..4c978a8 Binary files /dev/null and b/build/receipt-printer differ diff --git a/build/src/main.c.o b/build/src/main.c.o new file mode 100644 index 0000000..b2a9b98 Binary files /dev/null and b/build/src/main.c.o differ diff --git a/build/src/printer.c.o b/build/src/printer.c.o new file mode 100644 index 0000000..f701665 Binary files /dev/null and b/build/src/printer.c.o differ 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