diff --git a/klippy/extras/display/display.py b/klippy/extras/display/display.py index 11f60a57..8e47e5a1 100644 --- a/klippy/extras/display/display.py +++ b/klippy/extras/display/display.py @@ -100,9 +100,12 @@ class PrinterLCD: self.show_data_group = self.display_data_groups.get(dgroup) if self.show_data_group is None: raise config.error("Unknown display_data group '%s'" % (dgroup,)) + # Screen updating self.printer.register_event_handler("klippy:ready", self.handle_ready) self.screen_update_timer = self.reactor.register_timer( self.screen_update_event) + self.redraw_request_pending = False + self.redraw_time = 0. # Register g-code commands gcode = self.printer.lookup_object("gcode") gcode.register_mux_command('SET_DISPLAY_GROUP', 'DISPLAY', name, @@ -111,6 +114,8 @@ class PrinterLCD: if name == 'display': gcode.register_mux_command('SET_DISPLAY_GROUP', 'DISPLAY', None, self.cmd_SET_DISPLAY_GROUP) + def get_dimensions(self): + return self.lcd_chip.get_dimensions() # Configurable display def _parse_glyph(self, config, glyph_name, data, width, height): glyph_data = [] @@ -184,19 +189,28 @@ class PrinterLCD: self.reactor.update_timer(self.screen_update_timer, self.reactor.NOW) # Screen updating def screen_update_event(self, eventtime): + if self.redraw_request_pending: + self.redraw_request_pending = False + self.redraw_time = eventtime + 0.250 + self.lcd_chip.clear() # update menu component if self.menu is not None: ret = self.menu.screen_update_event(eventtime) if ret: - return ret + self.lcd_chip.flush() + return eventtime + .500 # Update normal display - self.lcd_chip.clear() try: self.show_data_group.show(self, self.display_templates, eventtime) except: logging.exception("Error during display screen update") self.lcd_chip.flush() return eventtime + .500 + def request_redraw(self): + if self.redraw_request_pending: + return + self.redraw_request_pending = True + self.reactor.update_timer(self.screen_update_timer, self.redraw_time) def draw_text(self, row, col, mixed_text, eventtime): pos = col for i, text in enumerate(mixed_text.split('~')): diff --git a/klippy/extras/display/menu.py b/klippy/extras/display/menu.py index cc5a29bb..50ad7ce6 100644 --- a/klippy/extras/display/menu.py +++ b/klippy/extras/display/menu.py @@ -616,7 +616,6 @@ menu_items = { } -MENU_UPDATE_DELAY = .100 TIMER_DELAY = .100 @@ -636,7 +635,7 @@ class MenuManager: self.context = {} self.root = None self._root = config.get('menu_root', '__main') - self.cols, self.rows = self.display.lcd_chip.get_dimensions() + self.cols, self.rows = self.display.get_dimensions() self.timeout = config.getint('menu_timeout', 0) self.timer = 0 self.eventtime = 0 @@ -808,14 +807,11 @@ class MenuManager: def screen_update_event(self, eventtime): # screen update - if self.is_running(): - self.display.lcd_chip.clear() - for y, line in enumerate(self.render(eventtime)): - self.display.draw_text(y, 0, line, eventtime) - self.display.lcd_chip.flush() - return eventtime + MENU_UPDATE_DELAY - else: - return 0 + if not self.is_running(): + return False + for y, line in enumerate(self.render(eventtime)): + self.display.draw_text(y, 0, line, eventtime) + return True def up(self, fast_rate=False): container = self.stack_peek() @@ -998,6 +994,7 @@ class MenuManager: self.down(True) elif key == 'back': self.back() + self.display.request_redraw() # Collection of manager class helper methods