mirror of
https://github.com/Klipper3d/klipper.git
synced 2025-07-24 23:24:01 -06:00
klippy: Add access methods and avoid peeking into the printer classes
Add get_reactor(), lookup_object(), lookup_module_objects(), and set_rollover_info() to the main Printer class so that callers do not need to peek into the class' members. Similarly, add get_printer() and get_name() methods to the ConfigWrapper class. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
f0a754e496
commit
81013ba5c8
10 changed files with 103 additions and 85 deletions
|
@ -1,6 +1,6 @@
|
|||
# Interface to Klipper micro-controller code
|
||||
#
|
||||
# Copyright (C) 2016,2017 Kevin O'Connor <kevin@koconnor.net>
|
||||
# Copyright (C) 2016-2018 Kevin O'Connor <kevin@koconnor.net>
|
||||
#
|
||||
# This file may be distributed under the terms of the GNU GPLv3 license.
|
||||
import sys, os, zlib, logging, math
|
||||
|
@ -409,7 +409,8 @@ class MCU:
|
|||
def __init__(self, printer, config, clocksync):
|
||||
self._printer = printer
|
||||
self._clocksync = clocksync
|
||||
self._name = config.section
|
||||
self._reactor = printer.get_reactor()
|
||||
self._name = config.get_name()
|
||||
if self._name.startswith('mcu '):
|
||||
self._name = self._name[4:]
|
||||
# Serial port
|
||||
|
@ -419,7 +420,7 @@ class MCU:
|
|||
or self._serialport.startswith("/tmp/klipper_host_")):
|
||||
baud = config.getint('baud', 250000, minval=2400)
|
||||
self._serial = serialhdl.SerialReader(
|
||||
printer.reactor, self._serialport, baud)
|
||||
self._reactor, self._serialport, baud)
|
||||
# Restarts
|
||||
self._restart_method = 'command'
|
||||
if baud:
|
||||
|
@ -430,8 +431,7 @@ class MCU:
|
|||
self._emergency_stop_cmd = None
|
||||
self._is_shutdown = self._is_timeout = False
|
||||
self._shutdown_msg = ""
|
||||
if printer.bglogger is not None:
|
||||
printer.bglogger.set_rollover_info(self._name, None)
|
||||
printer.set_rollover_info(self._name, None)
|
||||
# Config building
|
||||
pins.get_printer_pins(printer).register_chip(self._name, self)
|
||||
self._oid_count = 0
|
||||
|
@ -482,7 +482,7 @@ class MCU:
|
|||
logging.info("Attempting automated MCU '%s' restart: %s",
|
||||
self._name, reason)
|
||||
self._printer.request_exit('firmware_restart')
|
||||
self._printer.reactor.pause(self._printer.reactor.monotonic() + 2.000)
|
||||
self._reactor.pause(self._reactor.monotonic() + 2.000)
|
||||
raise error("Attempt MCU '%s' restart failed" % (self._name,))
|
||||
def _connect_file(self, pace=False):
|
||||
# In a debugging mode. Open debug output file and read data dictionary
|
||||
|
@ -566,16 +566,15 @@ class MCU:
|
|||
raise error("MCU '%s' CRC does not match config" % (self._name,))
|
||||
move_count = config_params['move_count']
|
||||
logging.info("Configured MCU '%s' (%d moves)", self._name, move_count)
|
||||
if self._printer.bglogger is not None:
|
||||
msgparser = self._serial.msgparser
|
||||
info = [
|
||||
"Configured MCU '%s' (%d moves)" % (self._name, move_count),
|
||||
"Loaded MCU '%s' %d commands (%s / %s)" % (
|
||||
self._name, len(msgparser.messages_by_id),
|
||||
msgparser.version, msgparser.build_versions),
|
||||
"MCU '%s' config: %s" % (self._name, " ".join(
|
||||
["%s=%s" % (k, v) for k, v in msgparser.config.items()]))]
|
||||
self._printer.bglogger.set_rollover_info(self._name, "\n".join(info))
|
||||
msgparser = self._serial.msgparser
|
||||
info = [
|
||||
"Configured MCU '%s' (%d moves)" % (self._name, move_count),
|
||||
"Loaded MCU '%s' %d commands (%s / %s)" % (
|
||||
self._name, len(msgparser.messages_by_id),
|
||||
msgparser.version, msgparser.build_versions),
|
||||
"MCU '%s' config: %s" % (self._name, " ".join(
|
||||
["%s=%s" % (k, v) for k, v in msgparser.config.items()]))]
|
||||
self._printer.set_rollover_info(self._name, "\n".join(info))
|
||||
self._steppersync = self._ffi_lib.steppersync_alloc(
|
||||
self._serial.serialqueue, self._stepqueues, len(self._stepqueues),
|
||||
move_count)
|
||||
|
@ -663,18 +662,17 @@ class MCU:
|
|||
def clock32_to_clock64(self, clock32):
|
||||
return self._clocksync.clock32_to_clock64(clock32)
|
||||
def pause(self, waketime):
|
||||
return self._printer.reactor.pause(waketime)
|
||||
return self._reactor.pause(waketime)
|
||||
def monotonic(self):
|
||||
return self._printer.reactor.monotonic()
|
||||
return self._reactor.monotonic()
|
||||
# Restarts
|
||||
def _restart_arduino(self):
|
||||
logging.info("Attempting MCU '%s' reset", self._name)
|
||||
self.disconnect()
|
||||
serialhdl.arduino_reset(self._serialport, self._printer.reactor)
|
||||
serialhdl.arduino_reset(self._serialport, self._reactor)
|
||||
def _restart_via_command(self):
|
||||
reactor = self._printer.reactor
|
||||
if ((self._reset_cmd is None and self._config_reset_cmd is None)
|
||||
or not self._clocksync.is_active(reactor.monotonic())):
|
||||
or not self._clocksync.is_active(self._reactor.monotonic())):
|
||||
logging.info("Unable to issue reset command on MCU '%s'", self._name)
|
||||
return
|
||||
if self._reset_cmd is None:
|
||||
|
@ -682,19 +680,19 @@ class MCU:
|
|||
logging.info("Attempting MCU '%s' config_reset command", self._name)
|
||||
self._is_shutdown = True
|
||||
self.do_shutdown(force=True)
|
||||
reactor.pause(reactor.monotonic() + 0.015)
|
||||
self._reactor.pause(self._reactor.monotonic() + 0.015)
|
||||
self.send(self._config_reset_cmd.encode())
|
||||
else:
|
||||
# Attempt reset via reset command
|
||||
logging.info("Attempting MCU '%s' reset command", self._name)
|
||||
self.send(self._reset_cmd.encode())
|
||||
reactor.pause(reactor.monotonic() + 0.015)
|
||||
self._reactor.pause(self._reactor.monotonic() + 0.015)
|
||||
self.disconnect()
|
||||
def _restart_rpi_usb(self):
|
||||
logging.info("Attempting MCU '%s' reset via rpi usb power", self._name)
|
||||
self.disconnect()
|
||||
chelper.run_hub_ctrl(0)
|
||||
self._printer.reactor.pause(self._printer.reactor.monotonic() + 2.)
|
||||
self._reactor.pause(self._reactor.monotonic() + 2.)
|
||||
chelper.run_hub_ctrl(1)
|
||||
def microcontroller_restart(self):
|
||||
if self._restart_method == 'rpi_usb':
|
||||
|
@ -773,20 +771,14 @@ def error_help(msg):
|
|||
return ""
|
||||
|
||||
def add_printer_objects(printer, config):
|
||||
mainsync = clocksync.ClockSync(printer.reactor)
|
||||
reactor = printer.get_reactor()
|
||||
mainsync = clocksync.ClockSync(reactor)
|
||||
printer.add_object('mcu', MCU(printer, config.getsection('mcu'), mainsync))
|
||||
for s in config.get_prefix_sections('mcu '):
|
||||
printer.add_object(s.section, MCU(
|
||||
printer, s, clocksync.SecondarySync(printer.reactor, mainsync)))
|
||||
|
||||
def get_printer_mcus(printer):
|
||||
return [printer.objects[n] for n in sorted(printer.objects)
|
||||
if n.startswith('mcu')]
|
||||
printer, s, clocksync.SecondarySync(reactor, mainsync)))
|
||||
|
||||
def get_printer_mcu(printer, name):
|
||||
mcu_name = name
|
||||
if name != 'mcu':
|
||||
mcu_name = 'mcu ' + name
|
||||
if mcu_name not in printer.objects:
|
||||
raise printer.config_error("Unknown MCU %s" % (name,))
|
||||
return printer.objects[mcu_name]
|
||||
if name == 'mcu':
|
||||
return printer.lookup_object(name)
|
||||
return printer.lookup_object('mcu ' + name)
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue