Skip to content

Commit

Permalink
add more special commands
Browse files Browse the repository at this point in the history
  • Loading branch information
SimonWaldherr committed Nov 6, 2018
1 parent 798fa42 commit a89d427
Show file tree
Hide file tree
Showing 5 changed files with 140 additions and 12 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -4,3 +4,4 @@ cmd/zplgfa/zplgfa
zplgfa.coverprofile
coverage.html
test.zpl.bin*
zplgfa.exe
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
13 changes: 13 additions & 0 deletions cmd/zplgfa/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand Down
55 changes: 43 additions & 12 deletions cmd/zplgfa/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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")
Expand All @@ -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 == "" {
Expand Down
81 changes: 81 additions & 0 deletions cmd/zplgfa/network.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,10 @@
package main

import (
"bufio"
"fmt"
"net"
"time"
)

func sendDataToZebra(ip, port, str string) error {
Expand All @@ -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")
}

0 comments on commit a89d427

Please sign in to comment.