go-catprinter/cli/main.go

165 lines
3.4 KiB
Go
Raw Normal View History

2024-09-10 20:45:30 +00:00
package main
import (
"fmt"
"git.massivebox.net/massivebox/go-catprinter"
"github.com/pkg/errors"
"log"
"os"
"time"
"github.com/urfave/cli/v2"
)
var flags = []cli.Flag{
&cli.StringFlag{
Name: "mac",
Usage: "MAC address of the printer. Provide this or name.",
},
&cli.StringFlag{
Name: "name",
Usage: "common name of the printer. Provide this or MAC.",
},
&cli.StringFlag{
Name: "image",
Usage: "path to the image file to be printed",
Required: true,
TakesFile: true,
},
&cli.BoolFlag{
Name: "lowerQuality",
Usage: "print with lower quality, but slightly faster speed",
},
&cli.BoolFlag{
Name: "autoRotate",
Usage: "rotate image to fit printer",
},
&cli.BoolFlag{
Name: "dontDither",
Usage: "don't dither the image",
},
&cli.Float64Flag{
Name: "blackPoint",
Value: 0.5,
Usage: "regulate at which point a gray pixel is printed as black",
},
&cli.BoolFlag{
Name: "debugLog",
Usage: "print debugging messages",
},
&cli.BoolFlag{
Name: "dumpImage",
Usage: "save dithered image to ./image.png",
},
&cli.BoolFlag{
Name: "dumpRequest",
Usage: "save raw data sent to printer to ./request.bin",
},
&cli.BoolFlag{
Name: "dontPrint",
Usage: "don't actually print the image",
},
}
func findMac(name string, c *catprinter.Client) (string, error) {
fmt.Printf("Finding MAC by name (will take %d seconds)...", c.Timeout/time.Second)
devices, err := c.ScanDevices(name)
if err != nil {
return "", err
}
switch len(devices) {
case 0:
return "", errors.New("no devices found with name " + name)
case 1:
for k, _ := range devices {
return k, nil
}
break
default:
fmt.Println("Found multiple devices:")
for m, n := range devices {
fmt.Printf("%s\t%s", m, n)
}
return "", errors.New("multiple devices found with name " + name + ", please specify MAC directly")
}
return "", nil
}
func action(cCtx *cli.Context) error {
var (
mac = cCtx.String("mac")
name = cCtx.String("name")
imagePath = cCtx.String("image")
lowerQuality = cCtx.Bool("lowerQuality")
autoRotate = cCtx.Bool("autoRotate")
dontDither = cCtx.Bool("dontDither")
blackPoint = cCtx.Float64("blackPoint")
debugLog = cCtx.Bool("debugLog")
dumpImage = cCtx.Bool("dumpImage")
dumpRequest = cCtx.Bool("dumpRequest")
dontPrint = cCtx.Bool("dontPrint")
)
fmt.Println("Initializing...")
c, err := catprinter.NewClient()
if err != nil {
return err
}
defer c.Stop()
c.Debug.Log = debugLog
c.Debug.DumpImage = dumpImage
c.Debug.DumpRequest = dumpRequest
c.Debug.DontPrint = dontPrint
opts := catprinter.NewOptions().
SetBestQuality(!lowerQuality).
SetDither(!dontDither).
SetAutoRotate(autoRotate).
SetBlackPoint(float32(blackPoint))
if (mac != "") == (name != "") {
return errors.New("either mac or name must be provided")
}
if name != "" {
mac, err = findMac(name, c)
if err != nil {
return err
}
}
fmt.Println("Connecting...")
err = c.Connect(mac)
if err != nil {
return err
}
fmt.Println("Connected!")
fmt.Println("Printing...")
err = c.PrintFile(imagePath, opts)
if err != nil {
return err
}
fmt.Println("All done, exiting now.")
return nil
}
func main() {
app := &cli.App{
Name: "catprinter",
Usage: "print images to some BLE thermal printers",
Flags: flags,
Action: action,
}
if err := app.Run(os.Args); err != nil {
log.Fatal(err)
}
}