gcode: Add support for CLEAR_SHUTDOWN command
Add ability to clear the MCU shutdown flag from the console. Signed-off-by: Kevin O'Connor <kevin@koconnor.net>
This commit is contained in:
parent
fbd7cc243b
commit
d2ecc9d80c
10
docs/Todo.md
10
docs/Todo.md
|
@ -14,16 +14,6 @@ Host user interaction
|
||||||
* Provide startup scripts so that Klippy can startup at system
|
* Provide startup scripts so that Klippy can startup at system
|
||||||
bootup.
|
bootup.
|
||||||
|
|
||||||
* Possibly rework the startup order of Klippy communication with
|
|
||||||
octoprint and the mcu. Currently Klippy only starts communication
|
|
||||||
with Octoprint after it connects with the firmware. However, this
|
|
||||||
limits the ability for Klippy to communicate connection errors to
|
|
||||||
the user. It also makes it difficult for Klippy to reconnect to the
|
|
||||||
firmware and/or restart the firmware if it needs to.
|
|
||||||
|
|
||||||
* Support clearing MCU shutdown events from the host without having
|
|
||||||
to restart the firmware.
|
|
||||||
|
|
||||||
* Allow loading of a new config without having to restart the mcu.
|
* Allow loading of a new config without having to restart the mcu.
|
||||||
|
|
||||||
* Improve gcode interface:
|
* Improve gcode interface:
|
||||||
|
|
|
@ -47,7 +47,7 @@ class GCodeParser:
|
||||||
def build_handlers(self):
|
def build_handlers(self):
|
||||||
handlers = ['G1', 'G4', 'G20', 'G21', 'G28', 'G90', 'G91', 'G92',
|
handlers = ['G1', 'G4', 'G20', 'G21', 'G28', 'G90', 'G91', 'G92',
|
||||||
'M18', 'M82', 'M83', 'M105', 'M110', 'M114', 'M206',
|
'M18', 'M82', 'M83', 'M105', 'M110', 'M114', 'M206',
|
||||||
'HELP', 'QUERY_ENDSTOPS', 'RESTART']
|
'HELP', 'QUERY_ENDSTOPS', 'RESTART', 'CLEAR_SHUTDOWN']
|
||||||
if self.heater_nozzle is not None:
|
if self.heater_nozzle is not None:
|
||||||
handlers.extend(['M104', 'M109', 'PID_TUNE'])
|
handlers.extend(['M104', 'M109', 'PID_TUNE'])
|
||||||
if self.heater_bed is not None:
|
if self.heater_bed is not None:
|
||||||
|
@ -367,6 +367,14 @@ class GCodeParser:
|
||||||
temp = float(params.get('S', '60'))
|
temp = float(params.get('S', '60'))
|
||||||
heater.start_auto_tune(temp)
|
heater.start_auto_tune(temp)
|
||||||
self.bg_temp(heater)
|
self.bg_temp(heater)
|
||||||
|
cmd_CLEAR_SHUTDOWN_when_not_ready = True
|
||||||
|
cmd_CLEAR_SHUTDOWN_help = "Clear firmware shutdown and restart"
|
||||||
|
def cmd_CLEAR_SHUTDOWN(self, params):
|
||||||
|
if self.toolhead is None:
|
||||||
|
self.cmd_default(params)
|
||||||
|
return
|
||||||
|
self.printer.mcu.clear_shutdown()
|
||||||
|
self.printer.request_restart()
|
||||||
cmd_RESTART_when_not_ready = True
|
cmd_RESTART_when_not_ready = True
|
||||||
cmd_RESTART_help = "Reload config file and restart host software"
|
cmd_RESTART_help = "Reload config file and restart host software"
|
||||||
def cmd_RESTART(self, params):
|
def cmd_RESTART(self, params):
|
||||||
|
|
|
@ -26,9 +26,9 @@ Error configuring printer
|
||||||
"""
|
"""
|
||||||
|
|
||||||
message_shutdown = """
|
message_shutdown = """
|
||||||
This is an unrecoverable error. Please correct the
|
Once the underlying issue is corrected, the "CLEAR_SHUTDOWN"
|
||||||
underlying issue and then manually restart both the
|
command can be used to clear the firmware flag and restart
|
||||||
firmware and the host software.
|
the host software.
|
||||||
Printer is shutdown
|
Printer is shutdown
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
|
|
@ -308,7 +308,7 @@ class MCU:
|
||||||
self._timeout_timer = printer.reactor.register_timer(
|
self._timeout_timer = printer.reactor.register_timer(
|
||||||
self.timeout_handler)
|
self.timeout_handler)
|
||||||
# Config building
|
# Config building
|
||||||
self._emergency_stop_cmd = None
|
self._emergency_stop_cmd = self._clear_shutdown_cmd = None
|
||||||
self._num_oids = 0
|
self._num_oids = 0
|
||||||
self._config_cmds = []
|
self._config_cmds = []
|
||||||
self._config_crc = None
|
self._config_crc = None
|
||||||
|
@ -348,6 +348,7 @@ class MCU:
|
||||||
self._timeout_timer, time.time() + self.COMM_TIMEOUT)
|
self._timeout_timer, time.time() + self.COMM_TIMEOUT)
|
||||||
self._mcu_freq = float(self.serial.msgparser.config['CLOCK_FREQ'])
|
self._mcu_freq = float(self.serial.msgparser.config['CLOCK_FREQ'])
|
||||||
self._emergency_stop_cmd = self.lookup_command("emergency_stop")
|
self._emergency_stop_cmd = self.lookup_command("emergency_stop")
|
||||||
|
self._clear_shutdown_cmd = self.lookup_command("clear_shutdown")
|
||||||
self.register_msg(self.handle_shutdown, 'shutdown')
|
self.register_msg(self.handle_shutdown, 'shutdown')
|
||||||
self.register_msg(self.handle_shutdown, 'is_shutdown')
|
self.register_msg(self.handle_shutdown, 'is_shutdown')
|
||||||
self.register_msg(self.handle_mcu_stats, 'stats')
|
self.register_msg(self.handle_mcu_stats, 'stats')
|
||||||
|
@ -387,6 +388,9 @@ class MCU:
|
||||||
return stats
|
return stats
|
||||||
def force_shutdown(self):
|
def force_shutdown(self):
|
||||||
self.send(self._emergency_stop_cmd.encode())
|
self.send(self._emergency_stop_cmd.encode())
|
||||||
|
def clear_shutdown(self):
|
||||||
|
logging.info("Sending clear_shutdown command")
|
||||||
|
self.send(self._clear_shutdown_cmd.encode())
|
||||||
def is_fileoutput(self):
|
def is_fileoutput(self):
|
||||||
return self._is_fileoutput
|
return self._is_fileoutput
|
||||||
# Configuration phase
|
# Configuration phase
|
||||||
|
|
Loading…
Reference in New Issue