package service
import (
"git.anomalous.dev/57_Wolve/uberbringer/config"
fifo "github.com/foize/go.fifo"
"github.com/justinmichaelvieira/escpos"
"github.com/liamg/tml"
"net"
)
type Queue struct {
Data []Item `json:"data"`
}
type QueueItem struct {
JobID string
SequenceNumber int
Type int
Bold bool
Size int
Text string
}
// constructor function
func (std *QueueItem) fillDefaults() {
// setting default values
// if no values present
if std.JobID == "" {
std.JobID = "000000000000000000"
}
if std.SequenceNumber == 0 {
std.SequenceNumber = 0
}
if std.Type == 0 {
std.Type = 0
}
if std.Bold == false {
std.Bold = false
}
if std.Size == 0 {
std.Size = 1
}
if std.Text == "" {
std.Text = "NULL"
}
}
func newPrintJob(input DataStruct, queue *fifo.Queue) {
var byteLength int
for _, item := range input.Data {
byteLength += len(item.Text)
}
if byteLength > 4096 {
tml.Printf("[" + config.Project + "]: Job #" + input.JobID + " buffer limit reached\n")
return
} else {
tml.Printf("[" + config.Project + "]: Job #" + input.JobID + " buffer size used " + string(byteLength) + " bytes \n")
}
printJobCreate(input, queue)
}
func printJobCreate(input DataStruct, queue *fifo.Queue) {
tml.Printf("[" + config.Project + "]: Adding job #" + input.JobID + " to print queue\n")
socket, err := net.Dial("tcp", config.PrinterAddr+":9100")
if err != nil {
println(err.Error())
}
defer func(socket net.Conn) {
err := socket.Close()
if err != nil {
println(err.Error())
}
}(socket)
p := escpos.New(socket)
p.SetConfig(escpos.ConfigEpsonTMT20II)
p.Initialize()
p.DefaultLineSpacing()
for i, item := range input.Data {
var SeqNum = i + 1
tml.Printf("[" + config.Project + "]: Job #" + input.JobID + " - creating command " + string(SeqNum) + "\n")
if item.Type <= 0 || item.Type > 5 {
tml.Printf("[" + config.Project + "]: Job #" + input.JobID + " bad type\n")
return
} else if item.Size <= 0 || item.Size > 16 {
tml.Printf("[" + config.Project + "]: Job #" + input.JobID + " bad size\n")
return
} else {
switch item.Type {
case 1:
// Generate Regular Text
p.Bold(false).Size(uint8(item.Size), uint8(item.Size)).Write(item.Text)
case 2:
// Generate Bold Text
p.Bold(true).Size(uint8(item.Size), uint8(item.Size)).Write(item.Text)
case 3:
// Generate QR Code
p.QRCode(item.Text, true, uint8(item.Size), escpos.QRCodeErrorCorrectionLevelH)
case 4:
// New Line
p.LineFeed()
case 5:
// New Line X amount of times
p.LineFeedD(uint8(item.Size))
}
tml.Printf("[" + config.Project + "]: Job #" + input.JobID + " good type\n")
}
}
tml.Printf("[" + config.Project + "]: Printing job #" + input.JobID + "\n")
p.LineFeed()
err = p.PrintAndCut()
if err != nil {
println(err.Error())
}
tml.Printf("[" + config.Project + "]: Done printing #" + input.JobID + "\n")
}