Compare commits
3 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| fa8691c04e | |||
| 016dad446f | |||
| 06f38b707e |
@@ -1,7 +1,7 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
APP_NAME="libgofunc"
|
APP_NAME="libgofunc"
|
||||||
VERSION="${1:-v0.1.10}"
|
VERSION="${1:-v0.1.13}"
|
||||||
OUTPUT_DIR="../assets"
|
OUTPUT_DIR="../assets"
|
||||||
BUILD_DIR="../build"
|
BUILD_DIR="../build"
|
||||||
|
|
||||||
|
|||||||
26
cmd/main.go
26
cmd/main.go
File diff suppressed because one or more lines are too long
142
printer.go
142
printer.go
@@ -15,87 +15,54 @@ import (
|
|||||||
|
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
|
"errors"
|
||||||
|
|
||||||
"github.com/kenshaw/escpos"
|
"github.com/kenshaw/escpos"
|
||||||
)
|
)
|
||||||
import (
|
import "io"
|
||||||
"errors"
|
|
||||||
)
|
|
||||||
|
|
||||||
//export PrintImg
|
//export PrintImg
|
||||||
func PrintImg(printer *C.char, imagePath *C.char) *C.char {
|
func PrintImg(printer *C.char, imagePath *C.char) *C.char {
|
||||||
goPrinter := C.GoString(printer)
|
goPrinter := C.GoString(printer)
|
||||||
goImagePath := C.GoString(imagePath)
|
goImagePath := C.GoString(imagePath)
|
||||||
// printer := "tcp:192.168.100.151:9100"
|
err := Print(goPrinter, goImagePath)
|
||||||
// printer := "usb:/dev/usb/lp1"
|
if err != nil {
|
||||||
var w *bufio.ReadWriter
|
return NewErr(err)
|
||||||
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))
|
|
||||||
// } 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)
|
|
||||||
|
|
||||||
// // 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()
|
|
||||||
|
|
||||||
// // 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)
|
|
||||||
} else {
|
|
||||||
return NewErr(errors.New("invalid printer"))
|
|
||||||
}
|
}
|
||||||
|
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)
|
||||||
|
}
|
||||||
|
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))
|
||||||
|
|
||||||
prt := escpos.New(w)
|
prt := escpos.New(w)
|
||||||
|
|
||||||
prt.Init()
|
prt.Init()
|
||||||
prt.SetSmooth(1)
|
prt.SetSmooth(1)
|
||||||
prt.SetAlign("left")
|
prt.SetAlign("left")
|
||||||
|
|
||||||
imgBytes, err := imgData(goImagePath)
|
imgBytes, err := imgData(imagePath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return NewErr(err)
|
return err
|
||||||
}
|
}
|
||||||
err = WriteChunk(w, prt, imgBytes)
|
err = writeChunk(w, prt, imgBytes)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return NewErr(err)
|
return err
|
||||||
}
|
}
|
||||||
time.Sleep(500 * time.Millisecond)
|
time.Sleep(500 * time.Millisecond)
|
||||||
w.Flush()
|
w.Flush()
|
||||||
@@ -105,17 +72,50 @@ func PrintImg(printer *C.char, imagePath *C.char) *C.char {
|
|||||||
prt.End()
|
prt.End()
|
||||||
w.Flush()
|
w.Flush()
|
||||||
time.Sleep(1 * time.Second)
|
time.Sleep(1 * time.Second)
|
||||||
return NewOk(nil)
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func Print(printer, imagePath string) string {
|
func Check(printer string) error {
|
||||||
result := PrintImg(C.CString(printer), C.CString(imagePath))
|
conn, err := connect(printer)
|
||||||
r := C.GoString(result)
|
if err != nil {
|
||||||
return r
|
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()
|
||||||
}
|
}
|
||||||
|
|
||||||
// WriteChunk breaks the large byte array into smaller chunks
|
func connect(printer string) (io.ReadWriteCloser, error) {
|
||||||
func WriteChunk(w *bufio.ReadWriter, prt *escpos.Escpos, data []byte) 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:")
|
||||||
|
f, err := os.OpenFile(location, os.O_WRONLY, 0666)
|
||||||
|
if err != nil {
|
||||||
|
log.Println("error os.OpenFile usb:", err.Error())
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return f, nil
|
||||||
|
}
|
||||||
|
return nil, errors.New("invalid printer")
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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
|
chunkSize := 1024 // 1 KB chunks work best for network printers
|
||||||
for i := 0; i < len(data); i += chunkSize {
|
for i := 0; i < len(data); i += chunkSize {
|
||||||
end := min(i+chunkSize, len(data))
|
end := min(i+chunkSize, len(data))
|
||||||
|
|||||||
Reference in New Issue
Block a user