mirror of
https://github.com/Klipper3d/klipper.git
synced 2025-10-26 07:46:11 +01:00
led: run update function as reactor callback
Update functions could be called within the flush/lookahead context If the update function internally does pause() That would lead to the unpredictable execution of time-critical functions Signed-off-by: Timofey Titovets <nefelim4ag@gmail.com>
This commit is contained in:
committed by
KevinOConnor
parent
aea8d8e0a1
commit
6a8b823a45
@@ -10,6 +10,7 @@ from . import output_pin
|
|||||||
class LEDHelper:
|
class LEDHelper:
|
||||||
def __init__(self, config, update_func, led_count=1):
|
def __init__(self, config, update_func, led_count=1):
|
||||||
self.printer = config.get_printer()
|
self.printer = config.get_printer()
|
||||||
|
self.mutex = self.printer.get_reactor().mutex()
|
||||||
self.update_func = update_func
|
self.update_func = update_func
|
||||||
self.led_count = led_count
|
self.led_count = led_count
|
||||||
self.need_transmit = False
|
self.need_transmit = False
|
||||||
@@ -59,11 +60,16 @@ class LEDHelper:
|
|||||||
def _check_transmit(self, print_time=None):
|
def _check_transmit(self, print_time=None):
|
||||||
if not self.need_transmit:
|
if not self.need_transmit:
|
||||||
return
|
return
|
||||||
|
# Just avoid any race conditions
|
||||||
|
led_state = self.led_state
|
||||||
self.need_transmit = False
|
self.need_transmit = False
|
||||||
try:
|
def reactor_cb(eventtime):
|
||||||
self.update_func(self.led_state, print_time)
|
try:
|
||||||
except self.printer.command_error as e:
|
with self.mutex:
|
||||||
logging.exception("led update transmit error")
|
self.update_func(led_state, print_time)
|
||||||
|
except self.printer.command_error as e:
|
||||||
|
logging.exception("led update transmit error")
|
||||||
|
self.printer.get_reactor().register_callback(reactor_cb)
|
||||||
cmd_SET_LED_help = "Set the color of an LED"
|
cmd_SET_LED_help = "Set the color of an LED"
|
||||||
def cmd_SET_LED(self, gcmd):
|
def cmd_SET_LED(self, gcmd):
|
||||||
# Parse parameters
|
# Parse parameters
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ MAX_MCU_SIZE = 500 # Sanity check on LED chain length
|
|||||||
class PrinterNeoPixel:
|
class PrinterNeoPixel:
|
||||||
def __init__(self, config):
|
def __init__(self, config):
|
||||||
self.printer = printer = config.get_printer()
|
self.printer = printer = config.get_printer()
|
||||||
self.mutex = printer.get_reactor().mutex()
|
|
||||||
# Configure neopixel
|
# Configure neopixel
|
||||||
ppins = printer.lookup_object('pins')
|
ppins = printer.lookup_object('pins')
|
||||||
pin_params = ppins.lookup_pin(config.get('pin'))
|
pin_params = ppins.lookup_pin(config.get('pin'))
|
||||||
@@ -99,11 +98,8 @@ class PrinterNeoPixel:
|
|||||||
else:
|
else:
|
||||||
logging.info("Neopixel update did not succeed")
|
logging.info("Neopixel update did not succeed")
|
||||||
def update_leds(self, led_state, print_time):
|
def update_leds(self, led_state, print_time):
|
||||||
def reactor_bgfunc(eventtime):
|
self.update_color_data(led_state)
|
||||||
with self.mutex:
|
self.send_data(print_time)
|
||||||
self.update_color_data(led_state)
|
|
||||||
self.send_data(print_time)
|
|
||||||
self.printer.get_reactor().register_callback(reactor_bgfunc)
|
|
||||||
def get_status(self, eventtime=None):
|
def get_status(self, eventtime=None):
|
||||||
return self.led_helper.get_status(eventtime)
|
return self.led_helper.get_status(eventtime)
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ class PCA9533:
|
|||||||
minclock = 0
|
minclock = 0
|
||||||
if print_time is not None:
|
if print_time is not None:
|
||||||
minclock = self.i2c.get_mcu().print_time_to_clock(print_time)
|
minclock = self.i2c.get_mcu().print_time_to_clock(print_time)
|
||||||
self.i2c.i2c_write_noack([PCA9533_PLS0, ls0], minclock=minclock,
|
self.i2c.i2c_write([PCA9533_PLS0, ls0], minclock=minclock,
|
||||||
reqclock=BACKGROUND_PRIORITY_CLOCK)
|
reqclock=BACKGROUND_PRIORITY_CLOCK)
|
||||||
def get_status(self, eventtime):
|
def get_status(self, eventtime):
|
||||||
return self.led_helper.get_status(eventtime)
|
return self.led_helper.get_status(eventtime)
|
||||||
|
|||||||
@@ -37,7 +37,7 @@ class PCA9632:
|
|||||||
if self.prev_regs.get(reg) == val:
|
if self.prev_regs.get(reg) == val:
|
||||||
return
|
return
|
||||||
self.prev_regs[reg] = val
|
self.prev_regs[reg] = val
|
||||||
self.i2c.i2c_write_noack([reg, val], minclock=minclock,
|
self.i2c.i2c_write([reg, val], minclock=minclock,
|
||||||
reqclock=BACKGROUND_PRIORITY_CLOCK)
|
reqclock=BACKGROUND_PRIORITY_CLOCK)
|
||||||
def handle_connect(self):
|
def handle_connect(self):
|
||||||
#Configure MODE1
|
#Configure MODE1
|
||||||
|
|||||||
Reference in New Issue
Block a user