This commit is contained in:
luxflow 2025-12-19 08:21:49 +01:00 committed by GitHub
commit 2678cafbc2
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
5 changed files with 67 additions and 0 deletions

View file

@ -4460,6 +4460,9 @@ lcd_type:
# controls the content of the screen (see the "display_data" section
# for more information). The default is _default_20x4 for hd44780 or
# aip31068_spi displays and _default_16x4 for other displays.
#sleep_timeout:
# Timeout for sleep in seconds.
# The default is 0 seconds (disabled)
#menu_timeout:
# Timeout for menu. Being inactive this amount of seconds will
# trigger menu exit or return to root menu when having autorun

View file

@ -323,6 +323,12 @@ display data groups in the config, e.g. `[display_data <group>
command. If DISPLAY is not specified it defaults to "display" (the
primary display).
#### SET_DISPLAY_SLEEP
`SET_DISPLAY_SLEEP [DISPLAY=<display>] SLEEP=[0|1]`:
Set the display to sleep or wake
If DISPLAY is not specified it defaults to "display" (the
primary display).
### [display_status]
The display_status module is automatically loaded if a

View file

@ -179,6 +179,9 @@ class PrinterLCD:
self.reactor = self.printer.get_reactor()
# Load low-level lcd handler
self.lcd_chip = config.getchoice('lcd_type', LCD_chips)(config)
self.sleep_timeout = config.getint('sleep_timeout', 0)
self.next_sleep_time = 0
self.is_sleep = 0
# Load menu and display_status
self.menu = None
name = config.get_name()
@ -209,9 +212,15 @@ class PrinterLCD:
gcode.register_mux_command('SET_DISPLAY_GROUP', 'DISPLAY', name,
self.cmd_SET_DISPLAY_GROUP,
desc=self.cmd_SET_DISPLAY_GROUP_help)
gcode.register_mux_command('SET_DISPLAY_SLEEP', 'DISPLAY', name,
self.cmd_SET_DISPLAY_SLEEP,
desc=self.cmd_SET_DISPLAY_SLEEP_help)
if name == 'display':
gcode.register_mux_command('SET_DISPLAY_GROUP', 'DISPLAY', None,
self.cmd_SET_DISPLAY_GROUP)
gcode.register_mux_command('SET_DISPLAY_SLEEP', 'DISPLAY', None,
self.cmd_SET_DISPLAY_SLEEP,
desc=self.cmd_SET_DISPLAY_SLEEP_help)
def get_dimensions(self):
return self.lcd_chip.get_dimensions()
def handle_ready(self):
@ -220,6 +229,10 @@ class PrinterLCD:
self.reactor.update_timer(self.screen_update_timer, self.reactor.NOW)
# Screen updating
def screen_update_event(self, eventtime):
self.sleep_if_timeout(eventtime)
if self.is_sleep:
return eventtime + REDRAW_MIN_TIME
if self.redraw_request_pending:
self.redraw_request_pending = False
self.redraw_time = eventtime + REDRAW_MIN_TIME
@ -262,6 +275,21 @@ class PrinterLCD:
data = [0xff] + [(pixels >> (i * 8)) & 0xff] * 14 + [0xff]
self.lcd_chip.write_graphics(col + width - 1 - i, row, data)
return ""
def update_next_sleep_time(self, eventtime):
if self.sleep_timeout != 0:
self.next_sleep_time = eventtime + self.sleep_timeout
def sleep_if_timeout(self, eventtime):
if self.is_sleep == 0 and self.sleep_timeout != 0:
if self.next_sleep_time == 0:
self.update_next_sleep_time(eventtime)
elif self.is_sleep == 0 and self.next_sleep_time < eventtime:
self.sleep(1)
def sleep(self, sleep):
if self.lcd_chip.sleep:
self.lcd_chip.sleep(sleep)
self.is_sleep = sleep
if not sleep:
self.next_sleep_time = 0
cmd_SET_DISPLAY_GROUP_help = "Set the active display group"
def cmd_SET_DISPLAY_GROUP(self, gcmd):
group = gcmd.get('GROUP')
@ -269,6 +297,10 @@ class PrinterLCD:
if new_dg is None:
raise gcmd.error("Unknown display_data group '%s'" % (group,))
self.show_data_group = new_dg
cmd_SET_DISPLAY_SLEEP_help = "Set the display to sleep"
def cmd_SET_DISPLAY_SLEEP(self, gcmd):
sleep = gcmd.get_int("SLEEP", 1)
self.sleep(sleep)
def load_config(config):
return PrinterLCD(config)

View file

@ -722,6 +722,7 @@ class MenuManager:
self.send_event('init', self)
def handle_ready(self):
self.display_list = self.printer.lookup_objects('display')
# start timer
reactor = self.printer.get_reactor()
reactor.register_timer(self.timer_event, reactor.NOW)
@ -1026,6 +1027,11 @@ class MenuManager:
self.begin(eventtime)
def key_event(self, key, eventtime):
for _, display in self.display_list:
if display.is_sleep:
display.sleep(0)
display.update_next_sleep_time(eventtime)
if key == 'click':
self._click_callback(eventtime, key)
elif key == 'long_click':

View file

@ -193,6 +193,17 @@ class UC1701(DisplayBase):
self.send([0xA5]) # display all
self.send([0xA4]) # normal display
self.flush()
def sleep(self, on):
sleep_cmds = [
0xAE, # Display Off
0xA5 # All pixel On
]
wake_cmds = [
0xA4, # All pixel Off
0xAF # Display On
]
self.send(sleep_cmds if on else wake_cmds)
self.flush()
# The SSD1306 supports both i2c and "4-wire" spi
class SSD1306(DisplayBase):
@ -232,6 +243,15 @@ class SSD1306(DisplayBase):
]
self.send(init_cmds)
self.flush()
def sleep(self, on):
sleep_cmds = [
0xAE, # Display Off
]
wake_cmds = [
0xAF # Display On
]
self.send(sleep_cmds if on else wake_cmds)
self.flush()
# the SH1106 is SSD1306 compatible with up to 132 columns
class SH1106(SSD1306):