Skip to content

Commit

Permalink
added new extrusion screen for for toolchanger and returned universal…
Browse files Browse the repository at this point in the history
… filament screen
  • Loading branch information
alexkv committed Dec 19, 2019
1 parent 2c4f7cd commit 0f1d264
Show file tree
Hide file tree
Showing 5 changed files with 434 additions and 44 deletions.
195 changes: 195 additions & 0 deletions ui/extrude_multitool.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
package ui

import (
"fmt"
"strings"
"time"

"github.com/gotk3/gotk3/gtk"
"github.com/mcuadros/go-octoprint"
)

var extrudeMultitoolPanelInstance *extrudeMultitoolPanel

type extrudeMultitoolPanel struct {
CommonPanel

amount *StepButton

box *gtk.Box
labels map[string]*LabelWithImage
previous *octoprint.TemperatureState
}

func ExtrudeMultitoolPanel(ui *UI, parent Panel) Panel {
if extrudeMultitoolPanelInstance == nil {
m := &extrudeMultitoolPanel{CommonPanel: NewCommonPanel(ui, parent),
labels: map[string]*LabelWithImage{},
}
m.panelH = 3
m.b = NewBackgroundTask(time.Second*5, m.updateTemperatures)
m.initialize()
extrudeMultitoolPanelInstance = m
}

return extrudeMultitoolPanelInstance
}

func (m *extrudeMultitoolPanel) initialize() {
defer m.Initialize()

m.Grid().Attach(m.createChangeToolButton(0), 1, 0, 1, 1)
m.Grid().Attach(m.createChangeToolButton(1), 2, 0, 1, 1)
m.Grid().Attach(m.createChangeToolButton(2), 3, 0, 1, 1)
m.Grid().Attach(m.createChangeToolButton(3), 4, 0, 1, 1)

m.Grid().Attach(m.createExtrudeButton("Extrude", "extrude.svg", 1), 1, 1, 1, 1)
m.Grid().Attach(m.createExtrudeButton("Retract", "retract.svg", -1), 4, 1, 1, 1)

m.box = MustBox(gtk.ORIENTATION_VERTICAL, 5)
m.box.SetVAlign(gtk.ALIGN_CENTER)
m.box.SetHAlign(gtk.ALIGN_CENTER)
m.Grid().Attach(m.box, 2, 1, 2, 1)

m.Grid().Attach(MustButtonImageStyle("Temperature", "heat-up.svg", "color4", m.showTemperature), 1, 2, 1, 1)
m.amount = MustStepButton("move-step.svg", Step{"1mm", 1}, Step{"5mm", 5}, Step{"10mm", 10})
m.Grid().Attach(m.amount, 2, 2, 1, 1)

m.Grid().Attach(m.createFlowrateButton(), 3, 2, 1, 1)
}

func (m *extrudeMultitoolPanel) updateTemperatures() {
s, err := (&octoprint.ToolStateRequest{
History: true,
Limit: 1,
}).Do(m.UI.Printer)

if err != nil {
Logger.Error(err)
return
}

m.loadTemperatureState(s)
}

func (m *extrudeMultitoolPanel) loadTemperatureState(s *octoprint.TemperatureState) {
for tool, current := range s.Current {
if _, ok := m.labels[tool]; !ok {
m.addNewTool(tool)
}

m.loadTemperatureData(tool, &current)
}

m.previous = s
}

func (m *extrudeMultitoolPanel) addNewTool(tool string) {
m.labels[tool] = MustLabelWithImage("extruder.svg", "")
m.box.Add(m.labels[tool])

Logger.Infof("New tool detected %s", tool)
}

func (m *extrudeMultitoolPanel) loadTemperatureData(tool string, d *octoprint.TemperatureData) {
text := fmt.Sprintf("%s: %.1f°C / %.1f°C", strings.Title(tool), d.Actual, d.Target)

if m.previous != nil && d.Target > 0 {
if p, ok := m.previous.Current[tool]; ok {
text = fmt.Sprintf("%s (%.1f°C)", text, d.Actual-p.Actual)
}
}

m.labels[tool].Label.SetText(text)
m.labels[tool].ShowAll()
}

func (m *extrudeMultitoolPanel) createFlowrateButton() *StepButton {
b := MustStepButton("speed-step.svg", Step{"Slow", 75}, Step{"Normal", 100}, Step{"High", 125})
b.Callback = func() {
cmd := &octoprint.ToolFlowrateRequest{}
cmd.Factor = b.Value().(int)

Logger.Infof("Changing flowrate to %d%%", cmd.Factor)
if err := cmd.Do(m.UI.Printer); err != nil {
Logger.Error(err)
return
}
}

return b
}

func (m *extrudeMultitoolPanel) createLoadButton() gtk.IWidget {
length := 750.0

if m.UI.Settings != nil {
length = m.UI.Settings.FilamentInLength
}

return MustButtonImage("Load", "extrude.svg", func() {
cmd := &octoprint.CommandRequest{}
cmd.Commands = []string{
"G91",
fmt.Sprintf("G0 E%.1f F5000", length*0.80),
fmt.Sprintf("G0 E%.1f F500", length*0.20),
"G90",
}

Logger.Info("Sending filament load request")
if err := cmd.Do(m.UI.Printer); err != nil {
Logger.Error(err)
return
}
})
}

func (m *extrudeMultitoolPanel) createUnloadButton() gtk.IWidget {

length := 800.0

if m.UI.Settings != nil {
length = m.UI.Settings.FilamentOutLength
}

return MustButtonImage("Unload", "retract.svg", func() {
cmd := &octoprint.CommandRequest{}
cmd.Commands = []string{
"G91",
fmt.Sprintf("G0 E-%.1f F5000", length),
"G90",
}

Logger.Info("Sending filament unload request")
if err := cmd.Do(m.UI.Printer); err != nil {
Logger.Error(err)
return
}
})
}

func (m *extrudeMultitoolPanel) createExtrudeButton(label, image string, dir int) gtk.IWidget {
return MustPressedButton(label, image, func() {
cmd := &octoprint.ToolExtrudeRequest{}
cmd.Amount = m.amount.Value().(int) * dir

Logger.Infof("Sending extrude request, with amount %d", cmd.Amount)
if err := cmd.Do(m.UI.Printer); err != nil {
Logger.Error(err)
return
}
}, 200)
}

func (m *extrudeMultitoolPanel) createChangeToolButton(num int) gtk.IWidget {
style := fmt.Sprintf("color%d", num+1)
name := fmt.Sprintf("Tool%d", num+1)
gcode := fmt.Sprintf("T%d", num)
return MustButtonImageStyle(name, "extruder.svg", style, func() {
m.command(gcode)
})
}

func (m *extrudeMultitoolPanel) showTemperature() {
m.UI.Add(TemperaturePanel(m.UI, m))
}
108 changes: 69 additions & 39 deletions ui/filament.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,9 @@ var filamentPanelInstance *filamentPanel
type filamentPanel struct {
CommonPanel

amount *StepButton
tool *StepButton

box *gtk.Box
labels map[string]*LabelWithImage
previous *octoprint.TemperatureState
Expand All @@ -36,22 +39,23 @@ func FilamentPanel(ui *UI, parent Panel) Panel {
func (m *filamentPanel) initialize() {
defer m.Initialize()

m.Grid().Attach(m.createChangeToolButton(0), 1, 0, 1, 1)
m.Grid().Attach(m.createChangeToolButton(1), 2, 0, 1, 1)
m.Grid().Attach(m.createChangeToolButton(2), 3, 0, 1, 1)
m.Grid().Attach(m.createChangeToolButton(3), 4, 0, 1, 1)

m.Grid().Attach(m.createLoadButton(), 1, 1, 1, 1)
m.Grid().Attach(m.createUnloadButton(), 4, 1, 1, 1)

m.Grid().Attach(MustButtonImageStyle("Temperature", "heat-up.svg", "color4", m.showTemperature), 1, 2, 1, 1)
m.Grid().Attach(m.createExtrudeButton("Extrude", "extrude.svg", 1), 1, 0, 1, 1)
m.Grid().Attach(m.createExtrudeButton("Retract", "retract.svg", -1), 4, 0, 1, 1)

m.box = MustBox(gtk.ORIENTATION_VERTICAL, 5)
m.box.SetVAlign(gtk.ALIGN_CENTER)
m.box.SetHAlign(gtk.ALIGN_CENTER)

m.Grid().Attach(m.box, 2, 1, 2, 2)
m.Grid().Attach(m.box, 2, 0, 2, 2)

m.amount = MustStepButton("move-step.svg", Step{"1mm", 1}, Step{"5mm", 5}, Step{"10mm", 10})
m.Grid().Attach(m.amount, 2, 2, 1, 1)

m.Grid().Attach(m.createToolButton(), 1, 2, 1, 1)
m.Grid().Attach(m.createFlowrateButton(), 3, 2, 1, 1)
}

func (m *filamentPanel) updateTemperatures() {
Expand Down Expand Up @@ -83,6 +87,7 @@ func (m *filamentPanel) loadTemperatureState(s *octoprint.TemperatureState) {
func (m *filamentPanel) addNewTool(tool string) {
m.labels[tool] = MustLabelWithImage("extruder.svg", "")
m.box.Add(m.labels[tool])
m.tool.AddStep(Step{strings.Title(tool), tool})

Logger.Infof("New tool detected %s", tool)
}
Expand All @@ -100,21 +105,43 @@ func (m *filamentPanel) loadTemperatureData(tool string, d *octoprint.Temperatur
m.labels[tool].ShowAll()
}

func (m *filamentPanel) createLoadButton() gtk.IWidget {
length := 750.0
func (m *filamentPanel) createToolButton() *StepButton {
m.tool = MustStepButton("extruder.svg")
m.tool.Callback = func() {
cmd := &octoprint.ToolSelectRequest{}
cmd.Tool = m.tool.Value().(string)

if m.UI.Settings != nil {
length = m.UI.Settings.FilamentInLength
Logger.Infof("Changing tool to %s", cmd.Tool)
if err := cmd.Do(m.UI.Printer); err != nil {
Logger.Error(err)
return
}
}

return MustButtonImageStyle("Load", "extrude.svg", "color3", func() {
cmd := &octoprint.CommandRequest{}
cmd.Commands = []string{
"G91",
fmt.Sprintf("G0 E%.1f F5000", length*0.80),
fmt.Sprintf("G0 E%.1f F500", length*0.20),
"G90",
return m.tool
}

func (m *filamentPanel) createFlowrateButton() *StepButton {
b := MustStepButton("speed-step.svg", Step{"Slow", 75}, Step{"Normal", 100}, Step{"High", 125})
b.Callback = func() {
cmd := &octoprint.ToolFlowrateRequest{}
cmd.Factor = b.Value().(int)

Logger.Infof("Changing flowrate to %d%%", cmd.Factor)
if err := cmd.Do(m.UI.Printer); err != nil {
Logger.Error(err)
return
}
}

return b
}

func (m *filamentPanel) createLoadButton() gtk.IWidget {

return MustButtonImage("Load", "extrude.svg", func() {
cmd := &octoprint.CommandRequest{}
cmd.Commands = []string{"G91", "G0 E600 F5000", "G0 E120 F500", "G90"}

Logger.Info("Sending filament load request")
if err := cmd.Do(m.UI.Printer); err != nil {
Expand All @@ -125,19 +152,10 @@ func (m *filamentPanel) createLoadButton() gtk.IWidget {
}

func (m *filamentPanel) createUnloadButton() gtk.IWidget {
length := 800.0

if m.UI.Settings != nil {
length = m.UI.Settings.FilamentOutLength
}

return MustButtonImageStyle("Unload", "extrude.svg", "color2", func() {
return MustButtonImage("Unload", "retract.svg", func() {
cmd := &octoprint.CommandRequest{}
cmd.Commands = []string{
"G91",
fmt.Sprintf("G0 E-%.1f F5000", length),
"G90",
}
cmd.Commands = []string{"G91", "G0 E-800 F5000", "G90"}

Logger.Info("Sending filament unload request")
if err := cmd.Do(m.UI.Printer); err != nil {
Expand All @@ -147,15 +165,27 @@ func (m *filamentPanel) createUnloadButton() gtk.IWidget {
})
}

func (m *filamentPanel) createChangeToolButton(num int) gtk.IWidget {
style := fmt.Sprintf("color%d", num+1)
name := fmt.Sprintf("Tool%d", num+1)
gcode := fmt.Sprintf("T%d", num)
return MustButtonImageStyle(name, "extruder.svg", style, func() {
m.command(gcode)
})
}
func (m *filamentPanel) createExtrudeButton(label, image string, dir int) gtk.IWidget {

return MustPressedButton(label, image, func() {
cmd := &octoprint.ToolExtrudeRequest{}
cmd.Amount = m.amount.Value().(int) * dir

func (m *filamentPanel) showTemperature() {
m.UI.Add(TemperaturePanel(m.UI, m))
Logger.Infof("Sending extrude request, with amount %d", cmd.Amount)
if err := cmd.Do(m.UI.Printer); err != nil {
Logger.Error(err)
return
}
}, 200)

// return MustButtonImage(label, image, func() {
// cmd := &octoprint.ToolExtrudeRequest{}
// cmd.Amount = m.amount.Value().(int) * dir

// Logger.Infof("Sending extrude request, with amount %d", cmd.Amount)
// if err := cmd.Do(m.UI.Printer); err != nil {
// Logger.Error(err)
// return
// }
// })
}
Loading

0 comments on commit 0f1d264

Please sign in to comment.