diff --git a/KlippyGcodes.py b/KlippyGcodes.py index 328205b8..3fdb47bb 100644 --- a/KlippyGcodes.py +++ b/KlippyGcodes.py @@ -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 diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 00000000..40ef0641 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,4 @@ +## Changelog + +#### 2020 11 13 +* Fine Tuning Panel is now fully functional: Z BabyStepping, Fan Speed, Speed Factor, and Extrusion Factor diff --git a/panels/fine_tune.py b/panels/fine_tune.py index f83813ca..101f7df5 100644 --- a/panels/fine_tune.py +++ b/panels/fine_tune.py @@ -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)) diff --git a/printer.py b/printer.py index 499b9664..a2e9c206 100644 --- a/printer.py +++ b/printer.py @@ -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] diff --git a/screen.py b/screen.py index d5cacc39..4172688d 100644 --- a/screen.py +++ b/screen.py @@ -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():