-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmission.go
136 lines (122 loc) · 2.81 KB
/
mission.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
package main
import (
"fmt"
"sync"
"time"
)
// 打印机唯一锁,防止多个进程对同一台打印机进行重复操作
var printLock sync.Mutex
// 任务项目
type mission struct {
progress int
item *PrintItem
}
// 待实现的打印任务管理器的大饼
type missionManager struct {
missionManagerList []*mission
}
// 大饼里面的添加大饼操作
func (m *missionManager) Add(mission *mission) {
m.missionManagerList = append(m.missionManagerList, mission)
}
// 打印任务创建
func (m *mission) Create(p *PrintItem) {
// 将任务引用指向已有对象
m.item = p
}
// 启动打印任务
func (m *mission) On() {
// 阻塞式锁定打印机
printLock.Lock()
defer printLock.Unlock()
if conn == false {
fmt.Println("系统无法找到打印机!请确认打印机连接状态后重新启动客户端!")
return
}
// 进纸,调整边距
m.start()
// todo 警告:该方法暂未实现第二页至多页的分页打印效果!
// item.Line为每一[行]的数组
for _, v := range m.item.Line {
err := m.send([]byte{lineReset})
if err != nil {
fmt.Println("行重置出错!", err)
}
// item.Line.LineComm 为每一行的[每列]指令数组,类型均为byte
for _, val := range v.LineComm {
err := m.send([]byte{val})
if err != nil {
m.COMError()
}
}
// 任务进度+1行
m.progress += 1
}
// lineMax为最大行数,用于检测是否不满一页,若不满则使用回车填满
for i := m.item.LineNum; i <= lineMax; i++ {
err := m.send([]byte{prChangeLine})
if err != nil {
m.COMError()
}
}
m.End()
}
// 检查任务进度
func (m *mission) CheckProgress() float32 {
progress := float32(m.progress) / float32(m.item.LineNum+1)
return progress
}
// 启动打印任务准备工作(进纸,调整页边距)
func (m *mission) start() {
// 进纸prtFeedPaper, prMarginTop, prMarginLeft
ping := []byte("printerVersion")
err := m.send([]byte{prtInitialize})
err = m.send(ping)
err = m.send(ping)
err = m.send([]byte{prtFeedPaper})
if err != nil {
}
// 调整上边距
err = m.send([]byte{prMarginTop})
if err != nil {
m.COMError()
}
// 调整左边距
err = m.send([]byte{prMarginLeft})
if err != nil {
m.COMError()
}
}
// 打印任务收尾工作,目前貌似只有一个调整下边距
func (m *mission) End() {
// 调整下边距
err := m.send([]byte{prMarginBottom})
if err != nil {
m.COMError()
}
}
// 向打印机发送数据
func (m *mission) send(data []byte) (err error) {
n, err := s.Write(data)
if err != nil {
m.COMError()
}
buf := make([]byte, 65535)
for true {
n, err = s.Read(buf)
if err != nil {
m.COMError()
}
if n == 0 {
time.Sleep(time.Second * 1)
} else {
s.Flush()
break
}
}
return
}
// 串口错误处理
func (m *mission) COMError() {
fmt.Println("串口通信错误!")
}