From a89d427a24f0b5ca705ce53d6c0ce8c31c564d3d Mon Sep 17 00:00:00 2001 From: Simon Waldherr Date: Tue, 6 Nov 2018 17:18:12 +0100 Subject: [PATCH] add more special commands --- .gitignore | 1 + README.md | 2 ++ cmd/zplgfa/README.md | 13 +++++++ cmd/zplgfa/main.go | 55 ++++++++++++++++++++++------- cmd/zplgfa/network.go | 81 +++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 140 insertions(+), 12 deletions(-) diff --git a/.gitignore b/.gitignore index bdf5dfe..5aa4cf3 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ cmd/zplgfa/zplgfa zplgfa.coverprofile coverage.html test.zpl.bin* +zplgfa.exe diff --git a/README.md b/README.md index e1487f9..d76b359 100644 --- a/README.md +++ b/README.md @@ -20,6 +20,8 @@ If you need a ready to use application and don't want to hassle around with sour ## example +take a look at the [example application](https://github.com/SimonWaldherr/zplgfa/tree/master/cmd/zplgfa). + ```go package main diff --git a/cmd/zplgfa/README.md b/cmd/zplgfa/README.md index 0c97448..dae5395 100644 --- a/cmd/zplgfa/README.md +++ b/cmd/zplgfa/README.md @@ -29,6 +29,19 @@ You can also use some effects, e.g. blur: zplgfa -file label.png -edit blur | nc 192.168.178.42 9100 ``` +or send special commands: + +```sh +zplgfa -cmd feed -ip 192.168.178.42 -port 9100 +``` + +you can also send multiple commands at once: + + +```sh +zplgfa -cmd cancel,calib,feed -ip 192.168.178.42 -port 9100 +``` + The ZPLGFA is actually just a demo application for the ZPLGFA package, if you need something for productive work, look at the source and build something, depending on your needs diff --git a/cmd/zplgfa/main.go b/cmd/zplgfa/main.go index 86dc3fb..eadbaf3 100644 --- a/cmd/zplgfa/main.go +++ b/cmd/zplgfa/main.go @@ -19,6 +19,47 @@ import ( "simonwaldherr.de/go/zplgfa" ) +func specialCmds(zebraCmdFlag, networkIpFlag, networkPortFlag string) bool { + var cmdSent bool + if strings.Contains(zebraCmdFlag, "cancel") && networkIpFlag != "" { + if err := sendCancelCmdToZebra(networkIpFlag, networkPortFlag); err == nil { + cmdSent = true + } + } + if strings.Contains(zebraCmdFlag, "calib") && networkIpFlag != "" { + if err := sendCalibCmdToZebra(networkIpFlag, networkPortFlag); err == nil { + cmdSent = true + } + } + if strings.Contains(zebraCmdFlag, "feed") && networkIpFlag != "" { + if err := sendFeedCmdToZebra(networkIpFlag, networkPortFlag); err == nil { + cmdSent = true + } + } + if strings.Contains(zebraCmdFlag, "info") && networkIpFlag != "" { + info, err := getInfoFromZebra(networkIpFlag, networkPortFlag) + if err == nil { + fmt.Println(info) + cmdSent = true + } + } + if strings.Contains(zebraCmdFlag, "config") && networkIpFlag != "" { + info, err := getConfigFromZebra(networkIpFlag, networkPortFlag) + if err == nil { + fmt.Println(info) + cmdSent = true + } + } + if strings.Contains(zebraCmdFlag, "diag") && networkIpFlag != "" { + info, err := getDiagFromZebra(networkIpFlag, networkPortFlag) + if err == nil { + fmt.Println(info) + cmdSent = true + } + } + return cmdSent +} + func main() { var filenameFlag string var zebraCmdFlag string @@ -28,10 +69,9 @@ func main() { var networkPortFlag string var imageResizeFlag float64 var graphicType zplgfa.GraphicType - var cmdSent bool flag.StringVar(&filenameFlag, "file", "", "filename to convert to zpl") - flag.StringVar(&zebraCmdFlag, "cmd", "", "send special command to printer [calib,feed]") + flag.StringVar(&zebraCmdFlag, "cmd", "", "send special command to printer [cancel,calib,feed,info,config,diag]") flag.StringVar(&graphicTypeFlag, "type", "CompressedASCII", "type of graphic field encoding") flag.StringVar(&imageEditFlag, "edit", "", "manipulate the image [invert,monochrome]") flag.StringVar(&networkIpFlag, "ip", "", "send zpl to printer") @@ -42,16 +82,7 @@ func main() { flag.Parse() // send special commands to printer - if strings.Contains(zebraCmdFlag, "calib") && networkIpFlag != "" { - if err := sendCalibCmdToZebra(networkIpFlag, networkPortFlag); err == nil { - cmdSent = true - } - } - if strings.Contains(zebraCmdFlag, "feed") && networkIpFlag != "" { - if err := sendFeedCmdToZebra(networkIpFlag, networkPortFlag); err == nil { - cmdSent = true - } - } + cmdSent := specialCmds(zebraCmdFlag, networkIpFlag, networkPortFlag) // check input parameter if filenameFlag == "" { diff --git a/cmd/zplgfa/network.go b/cmd/zplgfa/network.go index 968c384..84de893 100644 --- a/cmd/zplgfa/network.go +++ b/cmd/zplgfa/network.go @@ -1,8 +1,10 @@ package main import ( + "bufio" "fmt" "net" + "time" ) func sendDataToZebra(ip, port, str string) error { @@ -25,3 +27,82 @@ func sendFeedCmdToZebra(ip, port string) error { func sendCalibCmdToZebra(ip, port string) error { return sendDataToZebra(ip, port, "~jc^xa^jus^xz") } + +func sendCancelCmdToZebra(ip, port string) error { + return sendDataToZebra(ip, port, "~ja") +} + +func getInfoFromZebra(ip, port string) (string, error) { + tcpAddr, err := net.ResolveTCPAddr("tcp", ip+":"+port) + conn, err := net.DialTCP("tcp4", nil, tcpAddr) + if err == nil { + defer conn.Close() + + reader := bufio.NewReader(conn) + + conn.Write([]byte(fmt.Sprintf("%s\r\n\r\n", "~HI"))) + + message0, err := reader.ReadString('\n') + if err != nil { + return "", err + } + + conn.Write([]byte(fmt.Sprintf("%s\r\n\r\n", "~HS"))) + + message1, err := reader.ReadString('\n') + if err != nil { + return "", err + } + message2, err := reader.ReadString('\n') + if err != nil { + return "", err + } + message3, err := reader.ReadString('\n') + if err != nil { + return "", err + } + return fmt.Sprint(message0, message1, message2, message3), err + } + return "", err +} + +func getTerminalOutputFromZebra(ip, port, cmd string) (string, error) { + var config string + var lastInput time.Time + tcpAddr, err := net.ResolveTCPAddr("tcp", ip+":"+port) + conn, err := net.DialTCP("tcp4", nil, tcpAddr) + if err == nil { + defer conn.Close() + + conn.Write([]byte(fmt.Sprintf("%s\r\n\r\n", cmd))) + scanner := bufio.NewScanner(conn) + ticker := time.NewTicker(300 * time.Millisecond) + input := make(chan string) + go func(scanner *bufio.Scanner, input chan string) { + for scanner.Scan() { + input <- scanner.Text() + } + }(scanner, input) + + for { + select { + case i := <-input: + config += fmt.Sprintln(i) + lastInput = time.Now() + case <-ticker.C: + if time.Since(lastInput) > time.Duration(50*time.Millisecond) { + return config, nil + } + } + } + } + return "", err +} + +func getConfigFromZebra(ip, port string) (string, error) { + return getTerminalOutputFromZebra(ip, port, "^XA^HH^XZ") +} + +func getDiagFromZebra(ip, port string) (string, error) { + return getTerminalOutputFromZebra(ip, port, "~HD") +}