From c9e5b4d1e9affe3309fc2eae2aed73bc554117b9 Mon Sep 17 00:00:00 2001 From: Přemysl Janouch Date: Fri, 12 Apr 2019 02:15:28 +0200 Subject: Create a package for the printer --- brother-info/main.go | 66 +++++++--------------------------------------------- 1 file changed, 9 insertions(+), 57 deletions(-) (limited to 'brother-info/main.go') diff --git a/brother-info/main.go b/brother-info/main.go index b65b1dc..a1584e1 100644 --- a/brother-info/main.go +++ b/brother-info/main.go @@ -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 - } - } - - // Clear the print buffer. - invalidate := make([]byte, 400) - if _, err := f.Write(invalidate); err != nil { - log.Fatalln(err) + if printer == nil { + log.Fatalln("no suitable printer found") } + defer printer.Close() - // Initialize. - if _, err := f.WriteString("\x1b\x40"); err != nil { + if err := printer.Initialize(); err != nil { log.Fatalln(err) } - // Request status information. - if _, err := f.WriteString("\x1b\x69\x53"); err != nil { + status, err := printer.GetStatus() + if 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) } -- cgit v1.2.3-70-g09d2