Make fine tuning buttons work

This commit is contained in:
Jordan Ruthe 2020-11-13 20:55:40 -05:00
parent 47df413795
commit 934b2dc639
5 changed files with 166 additions and 42 deletions

View File

@ -18,7 +18,9 @@ class KlippyGcodes:
SET_BED_TEMP = "M140"
MAX_BED_TEMP = 150
SET_EXT_FACTOR = "M221"
SET_FAN_SPEED = "M106"
SET_SPD_FACTOR = "M220"
PROBE_CALIBRATE = "PROBE_CALIBRATE"
PROBE_MOVE = "TESTZ Z="
@ -43,6 +45,14 @@ class KlippyGcodes:
speed = str( int(float(int(speed) % 101)/100*255) )
return KlippyGcodes.SET_FAN_SPEED + " S"+ speed
@staticmethod
def set_extrusion_rate(rate):
return "%s S%s" % (KlippyGcodes.SET_EXT_FACTOR, rate)
@staticmethod
def set_speed_rate(rate):
return "%s S%s" % (KlippyGcodes.SET_SPD_FACTOR, rate)
@staticmethod
def probe_move(dist):
return KlippyGcodes.PROBE_MOVE + dist

4
docs/changelog.md Normal file
View File

@ -0,0 +1,4 @@
## Changelog
#### 2020 11 13
* Fine Tuning Panel is now fully functional: Z BabyStepping, Fan Speed, Speed Factor, and Extrusion Factor

View File

@ -8,56 +8,97 @@ from KlippyGtk import KlippyGtk
from KlippyGcodes import KlippyGcodes
from panels.screen_panel import ScreenPanel
logger = logging.getLogger("KlipperScreen.FineTunePanel")
class FineTune(ScreenPanel):
user_selecting = False
delta = 1
deltas = ['1','5','10','25']
bs = 0
bs_delta = "0.05"
bs_deltas = ["0.01","0.05"]
percent_delta = 1
percent_deltas = ['1','5','10','25']
extrusion = 0
speed = 0
def initialize(self, panel_name):
# Create gtk items here
grid = KlippyGtk.HomogeneousGrid()
logger.debug("FineTunePanel")
self.labels['z+'] = KlippyGtk.ButtonImage("move-z+", "Z+ .05mm", "color1")
self.labels['z+'] = KlippyGtk.ButtonImage("move-z-", "Z+", "color1")
self.labels['z+'].connect("clicked", self.change_babystepping, "+")
self.labels['zoffset'] = Gtk.Label("Z Offset: 0.00mm")
self.labels['z-'] = KlippyGtk.ButtonImage("move-z-", "Z- .05mm", "color1")
self.labels['zoffset'].get_style_context().add_class('temperature_entry')
self.labels['z-'] = KlippyGtk.ButtonImage("move-z+", "Z-", "color1")
self.labels['z-'].connect("clicked", self.change_babystepping, "-")
grid.attach(self.labels['z+'], 0, 0, 1, 1)
grid.attach(self.labels['zoffset'], 0, 1, 1, 1)
grid.attach(self.labels['z-'], 0, 2, 1, 1)
self.labels['fan+'] = KlippyGtk.ButtonImage("fan-on", "Increase Fan", "color2")
self.labels['fan+'].connect("clicked", self.change_fan, "+")
self.labels['fanspeed'] = Gtk.Label("Fan: 100%")
self.labels['fanspeed'].get_style_context().add_class('temperature_entry')
self.labels['fan-'] = KlippyGtk.ButtonImage("fan-off", "Decrease Fan", "color2")
self.labels['fan-'].connect("clicked", self.change_fan, "-")
grid.attach(self.labels['fan+'], 1, 0, 1, 1)
grid.attach(self.labels['fanspeed'], 1, 1, 1, 1)
grid.attach(self.labels['fan-'], 1, 2, 1, 1)
self.labels['speed+'] = KlippyGtk.ButtonImage("speed-step", "Increase Speed", "color3")
self.labels['speed+'].connect("clicked", self.change_speed, "+")
self.labels['speedfactor'] = Gtk.Label("Speed: 100%")
self.labels['speedfactor'].get_style_context().add_class('temperature_entry')
self.labels['speed-'] = KlippyGtk.ButtonImage("speed-step", "Decrease Speed", "color3")
self.labels['speed-'].connect("clicked", self.change_speed, "-")
grid.attach(self.labels['speed+'], 2, 0, 1, 1)
grid.attach(self.labels['speedfactor'], 2, 1, 1, 1)
grid.attach(self.labels['speed-'], 2, 2, 1, 1)
self.labels['extrude+'] = KlippyGtk.ButtonImage("extrude", "Increase Extrusion", "color4")
self.labels['extrude+'].connect("clicked", self.change_extrusion, "+")
self.labels['extrudefactor'] = Gtk.Label("Extrusion: 100%")
self.labels['extrudefactor'].get_style_context().add_class('temperature_entry')
self.labels['extrude-'] = KlippyGtk.ButtonImage("retract", "Decrease Extrusion", "color4")
self.labels['extrude-'].connect("clicked", self.change_extrusion, "-")
grid.attach(self.labels['extrude+'], 3, 0, 1, 1)
grid.attach(self.labels['extrudefactor'], 3, 1, 1, 1)
grid.attach(self.labels['extrude-'], 3, 2, 1, 1)
deltgrid = Gtk.Grid()
# babystepping grid
bsgrid = Gtk.Grid()
j = 0;
for i in self.deltas:
for i in self.bs_deltas:
self.labels[i] = KlippyGtk.ToggleButton(i)
self.labels[i].connect("clicked", self.change_delta, i)
self.labels[i].connect("clicked", self.change_bs_delta, i)
ctx = self.labels[i].get_style_context()
if j == 0:
ctx.add_class("distbutton_top")
elif j == len(self.deltas)-1:
elif j == len(self.bs_deltas)-1:
ctx.add_class("distbutton_bottom")
else:
ctx.add_class("distbutton")
if i == "0.05":
ctx.add_class("distbutton_active")
bsgrid.attach(self.labels[i], j, 0, 1, 1)
j += 1
grid.attach(bsgrid, 0, 3, 1, 1)
# Grid for percentage
deltgrid = Gtk.Grid()
j = 0;
for i in self.percent_deltas:
self.labels[i] = KlippyGtk.ToggleButton("%s%%" % i)
self.labels[i].connect("clicked", self.change_percent_delta, i)
ctx = self.labels[i].get_style_context()
if j == 0:
ctx.add_class("distbutton_top")
elif j == len(self.percent_deltas)-1:
ctx.add_class("distbutton_bottom")
else:
ctx.add_class("distbutton")
@ -78,31 +119,101 @@ class FineTune(ScreenPanel):
grid.attach(b,3,3,1,1)
self.panel = grid
#self._screen.add_subscription(panel_name)
self._screen.add_subscription(panel_name)
def process_update(self, data):
return
if "fan" in data and "speed" in data["fan"] and self.user_selecting == False:
self.labels["scale"].disconnect_by_func(self.select_fan_speed)
self.labels["scale"].set_value(float(int(float(data["fan"]["speed"]) * 100)))
self.labels["scale"].connect("value-changed", self.select_fan_speed)
if "gcode_move" in data:
if "homing_origin" in data["gcode_move"]:
self.labels['zoffset'].set_text("Z Offset: %.2fmm" % data["gcode_move"]["homing_origin"][2])
if "extrude_factor" in data["gcode_move"]:
self.extrusion = int(data["gcode_move"]["extrude_factor"]*100)
self.labels['extrudefactor'].set_text("Extrusion: %3d%%" % self.extrusion)
if "speed_factor" in data["gcode_move"]:
self.speed = int(data["gcode_move"]["speed_factor"]*100)
self.labels['speedfactor'].set_text("Speed: %3d%%" % self.speed)
def change_delta(self, widget, delta):
if self.delta == delta:
if "fan" in data and "speed" in data['fan']:
self.fan = int(round(data['fan']['speed'],2)*100)
self.labels['fanspeed'].set_text("Fan: %3d%%" % self.fan)
def change_babystepping(self, widget, dir):
if dir == "+":
gcode = "SET_GCODE_OFFSET Z_ADJUST=%s MOVE=1" % self.bs_delta
else:
gcode = "SET_GCODE_OFFSET Z_ADJUST=-%s MOVE=1" % self.bs_delta
self._screen._ws.klippy.gcode_script(gcode)
def change_bs_delta(self, widget, bs):
if self.bs_delta == bs:
return
logging.info("### BabyStepping " + str(bs))
ctx = self.labels[str(self.bs_delta)].get_style_context()
ctx.remove_class("distbutton_active")
self.bs_delta = bs
ctx = self.labels[self.bs_delta].get_style_context()
ctx.add_class("distbutton_active")
for i in self.bs_deltas:
if i == self.bs_delta:
continue
self.labels[i].set_active(False)
def change_extrusion(self, widget, dir):
if dir == "+":
self.extrusion += int(self.percent_delta)
else:
self.extrusion -= int(self.percent_delta)
if self.extrusion < 0:
self.extrusion = 0
self._screen._ws.klippy.gcode_script(KlippyGcodes.set_extrusion_rate(self.extrusion))
def change_fan(self, widget, dir):
if dir == "+":
self.fan += int(self.percent_delta)
else:
self.fan -= int(self.percent_delta)
if self.fan < 0:
self.fan = 0
elif self.fan > 100:
self.fan = 100
self._screen._ws.klippy.gcode_script(KlippyGcodes.set_fan_speed(self.fan))
def change_speed(self, widget, dir):
if dir == "+":
self.speed += int(self.percent_delta)
else:
self.speed -= int(self.percent_delta)
if self.speed < 0:
self.speed = 0
self._screen._ws.klippy.gcode_script(KlippyGcodes.set_speed_rate(self.speed))
def change_percent_delta(self, widget, delta):
if self.percent_delta == delta:
return
logging.info("### Delta " + str(delta))
ctx = self.labels[str(self.delta)].get_style_context()
ctx = self.labels[str(self.percent_delta)].get_style_context()
ctx.remove_class("distbutton_active")
self.delta = delta
ctx = self.labels[self.delta].get_style_context()
self.percent_delta = delta
ctx = self.labels[self.percent_delta].get_style_context()
ctx.add_class("distbutton_active")
for i in self.deltas:
if i == self.delta:
for i in self.percent_deltas:
if i == self.percent_delta:
continue
self.labels[str(i)].set_active(False)
#def
def select_fan_speed(self, widget):
if self.user_selecting == True:
@ -117,13 +228,3 @@ class FineTune(ScreenPanel):
self.user_selecting = False
self.panel.remove(self.labels["apply"])
self.panel.remove(self.labels["cancel"])
def set_fan_speed(self, widget):
self._screen._ws.klippy.gcode_script(KlippyGcodes.set_fan_speed(self.labels['scale'].get_value()))
self.cancel_select_fan_speed(widget)
def set_fan_on(self, widget, fanon):
speed = 100 if fanon == True else 0
self.labels["scale"].set_value(speed)
self._screen._ws.klippy.gcode_script(KlippyGcodes.set_fan_speed(speed))

View File

@ -36,7 +36,8 @@ class Printer:
logging.info("### Toolcount: " + str(self.toolcount) + " Heaters: " + str(self.extrudercount))
def process_update(self, data):
keys = ['virtual_sdcard','pause_resume','idle_timeoue','print_stats']
keys = ['virtual_sdcard','pause_resume','idle_timeout','print_stats']
keys = ['fan','gcode_move','idle_timeout','pause_resume','print_stats','toolhead','virtual_sdcard']
for x in keys:
if x in data:
for y in data[x]:
@ -64,6 +65,9 @@ class Printer:
return False
return self.config[section]
def get_data(self):
return self.data
def get_stat(self, stat, substat = None):
if substat != None:
return self.data[stat][substat]

View File

@ -127,6 +127,8 @@ class KlipperScreen(Gtk.Window):
status_objects = [
'idle_timeout',
'configfile',
'gcode_move',
'fan',
'toolhead',
'virtual_sdcard',
'print_stats',
@ -166,12 +168,14 @@ class KlipperScreen(Gtk.Window):
def ws_subscribe(self):
requested_updates = {
"objects": {
"toolhead": ["homed_axes","estimated_print_time","print_time","position","extruder"],
"virtual_sdcard": ["file_position","is_active","progress"],
"print_stats": ["print_duration","total_duration","filament_used","filename","state","message"],
"heater_bed": ["target","temperature"],
"configfile": ["config"],
"extruder": ["target","temperature","pressure_advance","smooth_time"],
"configfile": ["config"]
"fan": ["speed"],
"gcode_move": ["homing_origin","extrude_factor","speed_factor"],
"heater_bed": ["target","temperature"],
"print_stats": ["print_duration","total_duration","filament_used","filename","state","message"],
"toolhead": ["homed_axes","estimated_print_time","print_time","position","extruder"],
"virtual_sdcard": ["file_position","is_active","progress"]
}
}
self._ws.klippy.object_subscription(requested_updates)
@ -223,7 +227,7 @@ class KlipperScreen(Gtk.Window):
self.panels[panel_name].initialize(panel_name)
if hasattr(self.panels[panel_name],"process_update"):
self.panels[panel_name].process_update(self.last_update)
self.panels[panel_name].process_update(self.printer.get_data())
if hasattr(self.panels[panel_name],"activate"):
self.panels[panel_name].activate()
@ -337,12 +341,12 @@ class KlipperScreen(Gtk.Window):
logger.info("### Going to disconnected state")
self.printer_initializing("Klipper has shutdown")
return
elif action == "notify_klippy_ready":
logger.info("### Going to ready state")
self.printer_ready()
elif action == "notify_status_update":
self.printer.process_update(data)
if "webhooks" in data and "state" in data['webhooks']:
#if data['webhooks']['state'] == "shutdown":
# logger.info("### Going to disconnected state")
# self.printer_initializing("Klipper has shutdown")
if data['webhooks']['state'] == "ready":
logger.info("### Going to ready state")
self.printer_ready()
@ -407,6 +411,7 @@ class KlipperScreen(Gtk.Window):
self.show_panel('main_panel', "MainPanel", 2, items=self._config['mainmenu'], extrudercount=self.printer.get_extruder_count())
def printer_printing(self):
self.ws_subscribe()
self.show_panel('job_status',"JobStatusPanel", 2)
def main():