display: Move glyph definition to printer config

This commit allows to modify the icons (or glyphs) in the displays that
support it. Existing icons can be modified and new icons can be added via
a [display_glyph] section in the config.

Signed-off-by: Florian Heilmann <Florian.Heilmann@gmx.net>
This commit is contained in:
Florian Heilmann 2020-06-07 16:25:19 +00:00 committed by KevinOConnor
parent 722770f62f
commit 3dcac1308e
7 changed files with 196 additions and 173 deletions

View file

@ -100,9 +100,6 @@ 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.glyph_helpers = { 'animated_bed': self.animate_bed,
'animated_fan': self.animate_fan }
self.printer.register_event_handler("klippy:ready", self.handle_ready)
self.screen_update_timer = self.reactor.register_timer(
self.screen_update_event)
@ -139,6 +136,28 @@ class PrinterLCD:
for group_name, data_configs in groups.items():
dg = DisplayGroup(config, group_name, data_configs)
self.display_data_groups[group_name] = dg
# Load display glyphs
dg_prefix = 'display_glyph '
icons = {}
dg_main = config.get_prefix_sections(dg_prefix)
dg_main_names = {c.get_name(): 1 for c in dg_main}
dg_def = [c for c in dconfig.get_prefix_sections(dg_prefix)
if c.get_name() not in dg_main_names]
for dg in dg_main + dg_def:
glyph_name = dg.get_name()[len(dg_prefix):]
glyph_data = []
for line in dg.get('data').split('\n'):
if line:
line_val = int(line, 2)
if line_val > 65535:
raise config.error("Glyph line out of range for " + \
"glyph %s maximum is 65535" % (glyph_name,))
glyph_data.append(line_val)
if len(glyph_data) < 16:
raise config.error("Not enough lines for" + \
"glyph %s, 16 lines are needed" % (glyph_name,))
icons[dg.get_name()[len(dg_prefix):]] = glyph_data
self.lcd_chip.set_glyphs(icons)
# Initialization
def handle_ready(self):
self.lcd_chip.init()
@ -159,13 +178,6 @@ class PrinterLCD:
logging.exception("Error during display screen update")
self.lcd_chip.flush()
return eventtime + .500
# Rendering helpers
def animate_bed(self, row, col, eventtime):
frame = int(eventtime) & 1
return self.lcd_chip.write_glyph(col, row, 'bed_heat%d' % (frame + 1,))
def animate_fan(self, row, col, eventtime):
frame = int(eventtime) & 1
return self.lcd_chip.write_glyph(col, row, 'fan%d' % (frame + 1,))
def draw_text(self, row, col, mixed_text, eventtime):
pos = col
for i, text in enumerate(mixed_text.split('~')):
@ -173,8 +185,6 @@ class PrinterLCD:
# write text
self.lcd_chip.write_text(pos, row, text)
pos += len(text)
elif text in self.glyph_helpers:
pos += self.glyph_helpers[text](row, pos, eventtime)
else:
# write glyph
pos += self.lcd_chip.write_glyph(pos, row, text)