forked from Z-Bolt/OctoScreen
/
bed-level.go
123 lines (99 loc) · 2.56 KB
/
bed-level.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
package ui
import (
"fmt"
"github.com/gotk3/gotk3/gtk"
"github.com/mcuadros/go-octoprint"
)
var bedLevelPanelInstance *bedLevelPanel
type bedLevelPanel struct {
CommonPanel
points map[string][]float64
homed bool
}
func BedLevelPanel(ui *UI, parent Panel) Panel {
if bedLevelPanelInstance == nil {
m := &bedLevelPanel{CommonPanel: NewCommonPanel(ui, parent)}
m.initialize()
bedLevelPanelInstance = m
}
bedLevelPanelInstance.homed = false
return bedLevelPanelInstance
}
func (m *bedLevelPanel) initialize() {
defer m.Initialize()
m.defineLevelingPoints()
m.Grid().Attach(m.createLevelButton("t-l"), 2, 0, 1, 1)
m.Grid().Attach(m.createLevelButton("t-r"), 3, 0, 1, 1)
m.Grid().Attach(m.createLevelButton("b-l"), 2, 1, 1, 1)
m.Grid().Attach(m.createLevelButton("b-r"), 3, 1, 1, 1)
if m.UI.Settings != nil && m.UI.Settings.GCodes.AutoBedLevel != "" {
m.Grid().Attach(m.createAutoLevelButton(m.UI.Settings.GCodes.AutoBedLevel), 4, 0, 1, 1)
}
}
func (m *bedLevelPanel) defineLevelingPoints() {
c, err := (&octoprint.ConnectionRequest{}).Do(m.UI.Printer)
if err != nil {
Logger.Error(err)
return
}
Logger.Info(c.Current.PrinterProfile)
profile, err := (&octoprint.PrinterProfilesRequest{Id: c.Current.PrinterProfile}).Do(m.UI.Printer)
if err != nil {
Logger.Error(err)
return
}
xMax := profile.Volume.Width
yMax := profile.Volume.Depth
xOffset := xMax * 0.1
yOffset := yMax * 0.1
m.points = map[string][]float64{
"t-l": {xOffset, yMax - yOffset},
"t-r": {xMax - xOffset, yMax - yOffset},
"b-l": {xOffset, yOffset},
"b-r": {xMax - xOffset, yOffset},
}
}
func (m *bedLevelPanel) createLevelButton(p string) *gtk.Button {
img := fmt.Sprintf("bed-level-%s.svg", p)
b := MustButtonImage("", img, func() {
m.goHomeIfRequire()
cmd := &octoprint.CommandRequest{}
cmd.Commands = []string{
"G0 Z10 F2000",
fmt.Sprintf("G0 X%f Y%f F10000", m.points[p][0], m.points[p][1]),
"G0 Z0 F400",
}
if err := cmd.Do(m.UI.Printer); err != nil {
Logger.Error(err)
return
}
})
return b
}
func (m *bedLevelPanel) goHomeIfRequire() {
if m.homed {
return
}
cmd := &octoprint.CommandRequest{}
cmd.Commands = []string{
"G28",
}
if err := cmd.Do(m.UI.Printer); err != nil {
Logger.Error(err)
return
}
m.homed = true
}
func (m *bedLevelPanel) createAutoLevelButton(gcode string) *gtk.Button {
b := MustButtonImage("Auto Level", "bed-level.svg", func() {
cmd := &octoprint.CommandRequest{}
cmd.Commands = []string{
gcode,
}
if err := cmd.Do(m.UI.Printer); err != nil {
Logger.Error(err)
return
}
})
return b
}