From c5eb5535e5a62329b7e07ef964cf052db5df1cd6 Mon Sep 17 00:00:00 2001 From: Nathan Singer Date: Mon, 25 Aug 2025 12:22:15 -0400 Subject: [PATCH] initial second commit --- build/receipt-printer | Bin 21128 -> 21528 bytes build/src/main.c.o | Bin 8224 -> 4992 bytes build/src/printer.c.o | Bin 6352 -> 10480 bytes src/main.c | 69 ++++++-------------------------- src/printer.c | 90 +++++++++++++++++++++++++++++++++++++----- src/printer.h | 14 ++++--- 6 files changed, 99 insertions(+), 74 deletions(-) diff --git a/build/receipt-printer b/build/receipt-printer index 4c978a80cd3a380f9e326c494aa0fb00a164aa32..0858a129d4b10d66cbc39c8c7d55ea76e4610926 100755 GIT binary patch delta 6878 zcmeBJ$~a>M;{*vI1wjTdZ~&7G3=-ZGwU%)fa6z~Q6L0Es_Od}Zy^{qQ^*LLZAiS2z zo{ajOC!o9!lN%ZL3#KSRb)U}9%vU}j)sV4SSZ z5ojnN1d%^s3!yn66vF|iPaB|Kg^4#zUda(H3DpEv`@kMdfo&AtEX$eB$SAVeP;55q zCIJP;$p(UoUe$UG3}4dp_~l!`Dm{8_4fPoqJbGERK$PW=5>bzC);K)|29MSQC7k~s z@XI%V6ds1s9=*1VAceiAzb4NXlws7JyhBh<>!==v-AX(i02VpVDfJ&$V@=*P@{M%S}>o73194Ha-=w@Akthf8m|NkD{tW$I# zp3C|3|34(C4*g;O{~v7eWG)fQ`T!(5_&s`Ae{(}Lbo}}Me*#j({pfIglj70MqN>3F zQsDZ-@Icye*Kg7e9^I^ev_T2j_uDQ|j`rw02MV;@|NsB$&4eood!mnu!^j5 z@<%4|$p=_j#F!W+GcqthYP(6$YVIxbkW z1a1~s1VS)7GB7YOJrxI4k&GPd#h}WWg&hUYMM4-<=P^$Nu_Z-HL8=5;E-)}KaDqxjRsq&VkPN7p6MqMCFo{tqV36cuWTa86C_rcAhE&(i4`VDtZ+bL zr5+qDOps^++s_P&76t|}NUShHVucwL6HJV3pjhDtv6(@!!hsYI97yrN1c@dlNThL1 zVq{=A$|8TAfq{V+#OB(`%)oGsMeYRy14BJ8h{Ki7%)s!FMfE3035d=778K2(6eAGH z%)sCV@;93qBLf3VE2wT_S;Wl1z{v8HiGhKMWjP}Q12fBBkR*e^aj0rNHc$+(JO!m> zmUoOG)qY^rmP{bk+nE>`SQxmn8S5Ds>e*xpKt_}@GBAjDfs}#?4iF0*|IDWu7#Jit zSi9JmH!(6W2>xYeVCZJ!1SK!Qe@qMvJ#4}t%NQh085tM^Slie*ZZk442%TeQVCY~I z1G$<(Xdxp5LoXXED7SGi@PmwD2BjjVdPtI$Vq;=p5MX5I5Mg3qkWNW0V_@Wv_y>wy znX4eLaRnZXQ- zXf{w;QYat>iY*2Pa4`?g)UTNt7})19GB6ZMf$}HQ#0c)3)I5elbx`TTG%A^PeWl0gzo6Vo6LsAhpWfRTX> zlt82Spay|l2l64~oTV%b3}7o`;8sR6Ffe#mi-6=A7{E0x*vj7^D_fWu7`)|>o$3p< zQSP`1sQhPOU@(B_WZ=nU2;&9?FVn;X1_rhQCI$uhlDed)@Z>@Z;d)PDh<=c?yGUlL6b0Bp?e8Ca8eDBq*5V zxETc*-GtZ~806u8=7z)oELK5gE8vo3U|{G5wP+YP7=kCSw~}CFoqW(*B$|m)o{68G z1r+~aq7GD=fLa2~pkj`B9!LVz$YWt;WZ-0iwRWUfnV40Zp3RS9RWgrF{hXN}r8;3Vko+BEjSem2WmX)I% z#^rj-${Eed7-`7L(TXI-8_mjE!piK;%EV#!jFoc%SOpJR)Ci=44h)K4T~86(3)knO9;FU%~)k8JfkHFu<)$&PXg`fH(tWd%RPAehx!Q zW--k8w4(f6m<5v;*o$%Iq$UzYf}~_hYFT_n zVqQv4Y7wl%o0Fd&pPV#Vz)cF&&E;1??QCr4RrhX%XGhXy;jcr$?d(#0i-C6f!;RHc%0@{3c^ zl=}F)$2&Vseqf`lRh*ia5}#X~4s%j!MP><1HAtC{YnZD~yq~|H>ttVcSzS~seH|mf zmVp|6P-lWY4fV+6jW*I8U@w*>=1dM$6q~Hau0Hu2n@l~(<2k8isW}WOi6x0JyCL3# z1`9ON-%rxxX<=ESF@ zmarx!XQZY~mbH~+$pksg#-VQVB?mLu&Z*tTU6=aZPfHiNy;|L543_gL4u(I+7Jd+Cdhgh7&F16p{2`a2-IU=s-70UuCT4b+)okYt#Ere1vVL>F;Mb0!7` zkSqEJf4zTHhHzH8!t3{#wUZypvfOx>x5vX6rvEEoa^Q) zj-&kAywQ!Bar04kWoAZ!$uGV1IXR#c795imz0C#hKu2(3w9e#AZ+%V<@X!kb1IOfr z-sYShP@c!+hu-G!p&!@~P{w3UpZdw=UILRNefTFI_Ys88-N2$Co^|poA3aW33T~LJ z=<}esYJefFQ>F%jA{5`hqW@vokQdX7Wp4eNOlc&SphFcSgnulLH-vC)fDP zaKf@##pH$l_N*PC#`|PP7U9VP%p8+^IVN)iNHBIxRt&IbTs%23z@CfQ5E9^V?2}go zm~kdrK)63AzYH+vjIxIC{!Z2mH0KJ3&et%pOwI~4%#!s+1z iQQk25WuQ6d32;A_f#Jnu%^-8G4W1CWG{(tUUUC2}Jk9+8 delta 6504 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 AZU6uP diff --git a/build/src/main.c.o b/build/src/main.c.o index b2a9b982f98eddc9b2827884e357fababcfe4a08..f1881421a1843e85bf31a63b49f3e62bef657e77 100644 GIT binary patch literal 4992 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 F001xMEy@4@ diff --git a/build/src/printer.c.o b/build/src/printer.c.o index f7016659a429e12fab25e1df107a76fac94c51b8..1ce2d548ec21f6f9196b06fa8d2b822f88d5f5e8 100644 GIT binary patch literal 10480 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 diff --git a/src/main.c b/src/main.c index 990f34d..0788f75 100644 --- a/src/main.c +++ b/src/main.c @@ -7,67 +7,20 @@ int main(void) { - int err; - bool detached = false; - libusb_device_handle *dev_handler; + + SETUP_PRINTER(PRINTER_VENDOR_ID, PRINTER_PRODUCT_ID); + + + printer_feed(0x10); + + char* str = "This is a test string."; - /* Init BEGIN */ + printer_print(str, strlen(str)); - err = libusb_init_context(NULL, NULL, 0); - if (err != 0) { - perror("LIBUSB Error"); - exit(-1); - } + printer_feed(0x10); + printer_cut(false); - 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); - } + disconnect_from_printer(); - 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 index c00e5ad..c57efff 100644 --- a/src/printer.c +++ b/src/printer.c @@ -1,7 +1,70 @@ #include +#include +#include #include "printer.h" +struct usb_state { + libusb_device_handle* dev; + bool kernel_detached; +}; + +struct usb_state usb_dev; + +int connect_to_printer(uint16_t vid, uint16_t pid) +{ + int err; + usb_dev.kernel_detached = false; + + err = libusb_init_context(NULL, NULL, 0); + if (err) { + perror("libusb_init_context"); + return err; + } + + usb_dev.dev = libusb_open_device_with_vid_pid(NULL, vid, pid); + + err = libusb_open(libusb_get_device(usb_dev.dev), &(usb_dev.dev)); + if (err) { + perror("libusb_open"); + return err; + } + + err = libusb_kernel_driver_active(usb_dev.dev, 0); + if (err) { + libusb_detach_kernel_driver(usb_dev.dev, 0); + usb_dev.kernel_detached = true; + } + + err = libusb_claim_interface(usb_dev.dev, 0); + if (err) { + perror("libusb_claim_interface"); + return err; + } + + return 0; +} + +int disconnect_from_printer(void) +{ + int err; + + err = libusb_release_interface(usb_dev.dev, 0); + if (err) { + perror("libusb_release_interface"); + return err; + } + + if (usb_dev.kernel_detached) + libusb_attach_kernel_driver(usb_dev.dev, 0); + + libusb_close(usb_dev.dev); + + libusb_exit(NULL); + + return 0; +} + 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); @@ -9,11 +72,11 @@ void send_msg(libusb_device_handle* dev_handler, unsigned char* data, size_t len perror("libusb_bulk_transfer"); } -void printer_initialize(libusb_device_handle* dev_handler, bool beep) +void printer_initialize(bool beep) { unsigned char data[2] = {0x1B, 0x40}; // 0x1B 0x40 is printer initialize - send_msg(dev_handler, data, 2); + send_msg(usb_dev.dev, data, 2); if (!beep) @@ -21,29 +84,36 @@ void printer_initialize(libusb_device_handle* dev_handler, bool beep) data[1] = 0x07; // 0x1B 0x07 is beep for (int i = 0; i < 2; i++) - send_msg(dev_handler, data, 2); + send_msg(usb_dev.dev, data, 2); } -void printer_feed(libusb_device_handle* dev_handler, uint8_t lines) +void printer_clear(void) +{ + unsigned char data[1] = {0x10}; + + send_msg(usb_dev.dev, data, 1); +} + +void printer_feed(uint8_t lines) { unsigned char data[2] = {0x14, lines}; - send_msg(dev_handler, data, 2); + send_msg(usb_dev.dev, data, 2); } -void printer_cut(libusb_device_handle* dev_handler, bool partial) +void printer_cut(bool partial) { unsigned char data[1] = {0x19}; if (partial) data[0] = 0x1A; - send_msg(dev_handler, data, 1); + send_msg(usb_dev.dev, data, 1); } -void printer_print(libusb_device_handle* dev_handler, char* text, size_t len) +void printer_print(char* text, size_t len) { - send_msg(dev_handler, (unsigned char*) text, len); + send_msg(usb_dev.dev, (unsigned char*) text, len); unsigned char data[1] = {0x17}; - send_msg(dev_handler, data, 1); + send_msg(usb_dev.dev, data, 1); } diff --git a/src/printer.h b/src/printer.h index 61abbcf..9069eec 100644 --- a/src/printer.h +++ b/src/printer.h @@ -10,17 +10,19 @@ // 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); +int connect_to_printer(uint16_t vid, uint16_t pid); +int disconnect_from_printer(void); -void printer_initialize(libusb_device_handle* dev_handler, bool beep); +void printer_initialize(bool beep); +void printer_clear(void); -void printer_feed(libusb_device_handle* dev_handler, uint8_t lines); +void printer_feed(uint8_t lines); +void printer_cut(bool partial); +void printer_print(char* text, size_t len); -void printer_cut(libusb_device_handle* dev_handler, bool partial); -void printer_print(libusb_device_handle* dev_handler, char* text, size_t len); +#define SETUP_PRINTER(vid, pid) connect_to_printer(vid, pid); printer_initialize(true); printer_clear() #endif