Files
libgofunc/printer.go

137 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"
"errors"
2026-10-02 22:35:05 +06:30
"github.com/kenshaw/escpos"
)
2026-10-02 22:35:05 +06:30
import "io"
2026-03-16 22:42:30 +06:30
//export PrintImg
func PrintImg(printer *C.char, imagePath *C.char) *C.char {
goPrinter := C.GoString(printer)
goImagePath := C.GoString(imagePath)
2026-10-02 22:35:05 +06:30
err := Print(goPrinter, goImagePath)
if err != nil {
return NewErr(err)
}
return NewOk(nil)
}
//export CheckPrinter
func CheckPrinter(printer *C.char) *C.char {
goPrinter := C.GoString(printer)
err := Check(goPrinter)
if err != nil {
return NewErr(err)
2026-03-16 22:42:30 +06:30
}
2026-10-02 22:35:05 +06:30
return NewOk(nil)
}
func Print(printer, imagePath string) error {
conn, err := connect(printer)
if err != nil {
return err
}
defer conn.Close()
w := bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))
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-10-02 22:35:05 +06:30
imgBytes, err := imgData(imagePath)
2026-03-16 22:42:30 +06:30
if err != nil {
2026-10-02 22:35:05 +06:30
return err
2026-03-16 22:42:30 +06:30
}
2026-10-02 22:35:05 +06:30
err = writeChunk(w, prt, imgBytes)
if err != nil {
2026-10-02 22:35:05 +06:30
return err
}
time.Sleep(500 * time.Millisecond)
w.Flush()
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-10-02 22:35:05 +06:30
return nil
}
func Check(printer string) error {
conn, err := connect(printer)
if err != nil {
return err
}
defer conn.Close()
var w *bufio.ReadWriter
w = bufio.NewReadWriter(bufio.NewReader(conn), bufio.NewWriter(conn))
prt := escpos.New(w)
prt.Init()
prt.SetSmooth(1)
prt.SetAlign("left")
time.Sleep(100 * time.Millisecond)
return w.Flush()
2026-03-16 22:42:30 +06:30
}
2026-04-08 15:31:23 +06:30
2026-10-02 22:35:05 +06:30
func connect(printer string) (io.ReadWriteCloser, error) {
if strings.HasPrefix(printer, "tcp:") {
location := strings.TrimLeft(printer, "tcp:")
conn, err := net.Dial("tcp", location)
if err != nil {
log.Println("error net.Dial tcp:", err.Error())
return nil, err
}
return conn, nil
} else if strings.HasPrefix(printer, "usb:") {
location := strings.TrimLeft(printer, "usb:")
2026-10-09 12:03:25 +06:30
f, err := os.OpenFile(location, os.O_WRONLY, 0666)
2026-10-02 22:35:05 +06:30
if err != nil {
log.Println("error os.OpenFile usb:", err.Error())
return nil, err
}
return f, nil
}
return nil, errors.New("invalid printer")
2026-04-08 15:31:23 +06:30
}
2026-10-02 22:35:05 +06:30
// writeChunk breaks the large byte array into smaller chunks
func writeChunk(w *bufio.ReadWriter, prt *escpos.Escpos, data []byte) error {
chunkSize := 1024 // 1 KB chunks work best for network printers
for i := 0; i < len(data); i += chunkSize {
end := min(i+chunkSize, len(data))
_, err := prt.WriteRaw(data[i:end])
if err != nil {
log.Println("Error writing image chunk:", err)
return err
}
if err := w.Flush(); err != nil {
log.Println("Error flushing buffer:", err)
return err
}
// Give the printer's network chip a microsecond to breathe
time.Sleep(5 * time.Millisecond)
}
return nil
}