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) } }