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:
Kevin O'Connor 2016-12-01 00:08:35 -05:00
parent fbd7cc243b
commit d2ecc9d80c
4 changed files with 17 additions and 15 deletions

View File

@ -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:

View File

@ -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):

View File

@ -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
""" """

View File

@ -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