Files
libgofunc/printer.go

104 lines
2.7 KiB
Go
Raw Normal View History

2026-04-08 15:31:23 +06:30
package libgofunc
2026-03-16 22:42:30 +06:30
import (
2026-03-18 14:36:16 +06:30
/*
#include <stdint.h>
*/
2026-03-16 22:42:30 +06:30
"C"
_ "image/png"
"os"
"strings"
"bufio"
"log"
"net"
"time"
"github.com/kenshaw/escpos"
)
//export PrintImg
func PrintImg(printer *C.char, imagePath *C.char) *C.char {
goPrinter := C.GoString(printer)
goImagePath := C.GoString(imagePath)
// printer := "tcp:192.168.100.151:9100"
// printer := "usb:/dev/usb/lp1"
var w *bufio.ReadWriter
if strings.HasPrefix(goPrinter, "tcp:") {
location := strings.TrimLeft(goPrinter, "tcp:")
conn, err := net.Dial("tcp", location)
if err != nil {
log.Println("error dialing:", err.Error())
return NewErr(err)
}
defer conn.Close()
w = bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))
} else if strings.HasPrefix(goPrinter, "usb:") {
location := strings.TrimLeft(goPrinter, "usb:")
f, err := os.OpenFile(location, os.O_RDWR, os.ModeDevice)
if err != nil {
log.Println("error OpenFile usb:", err.Error())
return NewErr(err)
}
defer f.Close()
w = bufio.NewReadWriter(bufio.NewReader(f), bufio.NewWriter(f))
2026-06-02 10:08:24 +06:30
// } else if strings.HasPrefix(goPrinter, "int:") {
// ctx := gousb.NewContext()
// // location := strings.TrimLeft(goPrinter, "int:")
// targetBus := 1
// targetAddr := 5
// devs, err := ctx.OpenDevices(func(desc *gousb.DeviceDesc) bool {
// return int(desc.Bus) == targetBus && int(desc.Address) == targetAddr
// })
// if err != nil || len(devs) == 0 {
// log.Fatal("Could not find or open the device")
// }
// dev := devs[0]
// defer dev.Close()
// dev.SetAutoDetach(true)
2026-04-08 15:31:23 +06:30
2026-06-02 10:08:24 +06:30
// // 2. Claim the default interface (usually 0 for printers)
// // Note: This may require detaching the kernel driver on Linux
// intf, done, err := dev.DefaultInterface()
// if err != nil {
// log.Fatalf("Failed to claim interface: %v", err)
// }
// defer done()
2026-04-08 15:31:23 +06:30
2026-06-02 10:08:24 +06:30
// // 3. Open the Bulk Output Endpoint (usually endpoint #1 or #2)
// // You may need to inspect desc.Endpoints to find the correct Bulk Out ID
// out, err = intf.OutEndpoint(1)
// if err != nil {
// log.Fatalf("Failed to open OUT endpoint: %v", err)
// }
// // w = bufio.NewReadWriter(bufio.NewReader(outPort), bufio.NewWriter(f))
// rw := &USBReadWriter{out: out}
// reader := bufio.NewReader(rw)
// writer := bufio.NewWriter(rw)
// w = bufio.NewReadWriter(reader, writer)
2026-03-16 22:42:30 +06:30
}
prt := escpos.New(w)
prt.Init()
prt.SetSmooth(1)
2026-06-02 10:08:24 +06:30
prt.SetAlign("left")
2026-03-16 22:42:30 +06:30
err := printImg(prt, goImagePath)
if err != nil {
return NewErr(err)
}
2026-06-02 10:08:24 +06:30
prt.WriteRaw([]byte{0x1B, 0x64, 0x03})
2026-03-16 22:42:30 +06:30
prt.Cut()
prt.End()
w.Flush()
2026-06-02 10:08:24 +06:30
time.Sleep(1 * time.Second)
2026-03-16 22:42:30 +06:30
return NewOk(nil)
}
2026-04-08 15:31:23 +06:30
func Print(printer, imagePath string) string {
result := PrintImg(C.CString(printer), C.CString(imagePath))
r := C.GoString(result)
return r
}