Create a package for the printer

This commit is contained in:
2019-04-12 02:15:28 +02:00
parent e605078d89
commit c9e5b4d1e9
3 changed files with 237 additions and 93 deletions

View File

@@ -1,10 +1,9 @@
package main
import (
"io"
"log"
"os"
"time"
"janouch.name/sklad/ql"
)
func decodeBitfieldErrors(b byte, errors [8]string) []string {
@@ -19,25 +18,6 @@ func decodeBitfieldErrors(b byte, errors [8]string) []string {
// -----------------------------------------------------------------------------
type brotherStatus struct {
errors []string
}
// TODO: What exactly do we need? Probably extend as needed.
func decodeStatusInformation(d []byte) brotherStatus {
var status brotherStatus
status.errors = append(status.errors, decodeBitfieldErrors(d[8], [8]string{
"no media", "end of media", "cutter jam", "?", "printer in use",
"printer turned off", "high-voltage adapter", "fan motor error"})...)
status.errors = append(status.errors, decodeBitfieldErrors(d[9], [8]string{
"replace media", "expansion buffer full", "communication error",
"communication buffer full", "cover open", "cancel key",
"media cannot be fed", "system error"})...)
return status
}
// -----------------------------------------------------------------------------
func printStatusInformation(d []byte) {
if d[0] != 0x80 || d[1] != 0x20 || d[2] != 0x42 || d[3] != 0x34 {
log.Println("unexpected status fixed bytes")
@@ -157,51 +137,23 @@ func printStatusInformation(d []byte) {
}
func main() {
// Linux usblp module, located in /drivers/usb/class/usblp.c
// (at least that's where the trails go, I don't understand the code)
f, err := os.OpenFile("/dev/usb/lp0", os.O_RDWR, 0)
printer, err := ql.Open()
if err != nil {
log.Fatalln(err)
}
defer f.Close()
// Flush any former responses in the printer's queue.
for {
dummy := make([]byte, 32)
if _, err := f.Read(dummy); err == io.EOF {
break
}
if printer == nil {
log.Fatalln("no suitable printer found")
}
defer printer.Close()
// Clear the print buffer.
invalidate := make([]byte, 400)
if _, err := f.Write(invalidate); err != nil {
if err := printer.Initialize(); err != nil {
log.Fatalln(err)
}
// Initialize.
if _, err := f.WriteString("\x1b\x40"); err != nil {
status, err := printer.GetStatus()
if err != nil {
log.Fatalln(err)
}
// Request status information.
if _, err := f.WriteString("\x1b\x69\x53"); err != nil {
log.Fatalln(err)
}
// We need to poll the device.
status := make([]byte, 32)
for {
if n, err := f.Read(status); err == io.EOF {
time.Sleep(10 * time.Millisecond)
} else if err != nil {
log.Fatalln(err)
} else if n < 32 {
log.Fatalln("invalid read")
} else {
break
}
}
printStatusInformation(status)
}