2 Commits

Author SHA1 Message Date
5f4a427f3b split big chunk of data to write to printer 2026-09-08 17:24:54 +06:30
7bb8778611 pump to 0.1.10 2026-09-03 09:23:58 +06:30
4 changed files with 55 additions and 17 deletions

View File

@@ -1,7 +1,7 @@
#!/bin/bash #!/bin/bash
APP_NAME="libgofunc" APP_NAME="libgofunc"
VERSION="${1:-v0.1.9}" VERSION="${1:-v0.1.10}"
OUTPUT_DIR="../assets" OUTPUT_DIR="../assets"
BUILD_DIR="../build" BUILD_DIR="../build"

View File

@@ -9,6 +9,8 @@ import (
_ "image/png" _ "image/png"
) )
import ( import (
"encoding/json"
"gt.mokkon.com/sainw/libgofunc" "gt.mokkon.com/sainw/libgofunc"
) )
@@ -99,11 +101,24 @@ func main() {
စက်သုံးဆီ အရေအတွက် နှင့် အရည်အသွေးစျေးနှုန်းများ အားသံသယရှိပါက ph 09450539099, 09765421033, 09765421029 သို့တိုင်ကြား နိုင်ပါသည်။</p> စက်သုံးဆီ အရေအတွက် နှင့် အရည်အသွေးစျေးနှုန်းများ အားသံသယရှိပါက ph 09450539099, 09765421033, 09765421029 သို့တိုင်ကြား နိုင်ပါသည်။</p>
` `
type Data struct {
Status string `json:"status"`
Result []string `json:"result"`
}
result := libgofunc.GenImg(550, "./", payload, temp, "./") result := libgofunc.GenImg(550, "./", payload, temp, "./")
fmt.Println("Result:", result) fmt.Println("Result:", result)
// PrintImg(C.CString("usb:/dev/usb/lp1"), C.CString("build/out.png")) // PrintImg(C.CString("usb:/dev/usb/lp1"), C.CString("build/out.png"))
// libgofunc.Print("int:/dev/bus/usb/001/046", "./out.png") // libgofunc.Print("int:/dev/bus/usb/001/046", "./out.png")
// libgofunc.Print("tcp:192.168.100.110:9100", "./out.png")
data := Data{}
json.Unmarshal([]byte(result), &data)
fmt.Println("Data:", data)
for _, imgPath := range data.Result {
fmt.Println("Printing image:", imgPath)
libgofunc.Print("tcp:192.168.100.151:9100", imgPath)
}
// libgofunc.Print("usb:/dev/usb/lp1", "./out.png") // libgofunc.Print("usb:/dev/usb/lp1", "./out.png")
// printer := "tcp:192.168.100.151:9100" // printer := "tcp:192.168.100.151:9100"
// ListUSB() // ListUSB()

19
img.go
View File

@@ -22,8 +22,6 @@ import (
"golang.org/x/net/html" "golang.org/x/net/html"
"encoding/json" "encoding/json"
"github.com/kenshaw/escpos"
) )
import ( import (
"log" "log"
@@ -377,30 +375,25 @@ func findNode(n *html.Node, tag string) *html.Node {
return nil return nil
} }
func printImg(prt *escpos.Escpos, imgPath string) error { func imgData(imgPath string) ([]byte, error) {
imgFile, err := os.Open(imgPath) imgFile, err := os.Open(imgPath)
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return err return nil, err
} }
img, _, err := image.Decode(imgFile) img, _, err := image.Decode(imgFile)
defer imgFile.Close() defer imgFile.Close()
if err != nil { if err != nil {
fmt.Println(err) fmt.Println(err)
return err return nil, err
} }
data := []byte{0x1D, 0x4C, 0x00, 0x00} data := []byte{0x1D, 0x4C, 0x00, 0x00}
_, err = prt.WriteRaw(data)
if err != nil {
fmt.Println("error 0x1D, 0x4C:", err.Error())
}
gray := toMonochrome(img) gray := toMonochrome(img)
data = escposRaster(gray) imgData := escposRaster(gray)
data = append(data, imgData...)
_, err = prt.WriteRaw(data) return data, err
return err
} }
func LoadFont(size float64) (*font.Face, error) { func LoadFont(size float64) (*font.Face, error) {

View File

@@ -17,7 +17,9 @@ import (
"github.com/kenshaw/escpos" "github.com/kenshaw/escpos"
) )
import "errors" import (
"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 {
@@ -87,10 +89,17 @@ func PrintImg(printer *C.char, imagePath *C.char) *C.char {
prt.SetSmooth(1) prt.SetSmooth(1)
prt.SetAlign("left") prt.SetAlign("left")
err := printImg(prt, goImagePath) imgBytes, err := imgData(goImagePath)
if err != nil { if err != nil {
return NewErr(err) return NewErr(err)
} }
err = WriteChunk(w, prt, imgBytes)
if err != nil {
return NewErr(err)
}
time.Sleep(500 * time.Millisecond)
w.Flush()
prt.WriteRaw([]byte{0x1B, 0x64, 0x03}) prt.WriteRaw([]byte{0x1B, 0x64, 0x03})
prt.Cut() prt.Cut()
prt.End() prt.End()
@@ -104,3 +113,24 @@ func Print(printer, imagePath string) string {
r := C.GoString(result) r := C.GoString(result)
return r return r
} }
// 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
}