Compare commits
11 Commits
Author | SHA1 | Date | |
---|---|---|---|
a236450cb5 | |||
9d9ff8824f | |||
beff41780b | |||
3666aa5e8d | |||
15889e0dc7 | |||
62a6dac6e9 | |||
f8688d6415 | |||
d59d041b0b | |||
175f13bbde | |||
8a9a2fe401 | |||
8a2e732663 |
13
README.md
13
README.md
@ -10,7 +10,7 @@ That's the point of an EMERGENCY stop!
|
||||
|
||||
## Setup
|
||||
|
||||
Install manually using this URL:
|
||||
Install via the bundled plugin manager, or manually using this URL:
|
||||
|
||||
https://github.com/ntoff/OctoPrint-Estop/archive/master.zip
|
||||
|
||||
@ -20,12 +20,11 @@ Once installed, you may wish to move the button to the top of the sidebar, you c
|
||||
|
||||
Find the "appearance" section, and add the plugin to the top of the sidebar order. If no other components have been previously rearranged, you may end up with only the plugin in the order list, this is fine, you don't need to add every item to the list (not adding them won't stop them from showing up).
|
||||
|
||||
appearance:
|
||||
color: violet
|
||||
components:
|
||||
order:
|
||||
sidebar:
|
||||
- plugin_estop
|
||||
appearance:
|
||||
components:
|
||||
order:
|
||||
sidebar:
|
||||
- plugin_estop
|
||||
|
||||
Please note: White spaces are critical inside the config.yaml file, special care must be taken when adding or removing entries that the correct layout is maintained. For more information on config.yaml and its appearance section, see here: http://docs.octoprint.org/en/master/configuration/config_yaml.html#appearance
|
||||
|
||||
|
@ -3,11 +3,11 @@ layout: plugin
|
||||
|
||||
id: estop
|
||||
title: Emergency STOP! button
|
||||
description: Adds an emergency stop (gcode M112) button to the sidebar.
|
||||
description: Adds an emergency stop button to the sidebar.
|
||||
author: ntoff
|
||||
license: AGPLv3
|
||||
|
||||
date: 2017-03-23
|
||||
date: 2017-12-02
|
||||
|
||||
homepage: https://github.com/ntoff/OctoPrint-Estop
|
||||
source: https://github.com/ntoff/OctoPrint-Estop
|
||||
@ -21,10 +21,10 @@ tags:
|
||||
|
||||
|
||||
screenshots:
|
||||
- /assets/img/plugins/estop/enabled.PNG
|
||||
- url: /assets/img/plugins/estop/enabled.PNG
|
||||
alt: enabled
|
||||
caption: Enabled (logged in and operational)
|
||||
- /assets/img/plugins/estop/disabled.PNG
|
||||
- url: /assets/img/plugins/estop/disabled.PNG
|
||||
alt: disabled
|
||||
caption: Disabled (logged out or non operational)
|
||||
|
||||
@ -42,4 +42,6 @@ compatibility:
|
||||
- macos
|
||||
---
|
||||
|
||||
Adds a nice big emergency stop button that sends M112 to the printer in the case of an emergency.
|
||||
Adds a nice big emergency stop button that (by default) sends M112 to the printer in the case of an emergency. If your printer uses a different E-Stop command, there's a settings page entry to allow changing the command sent.
|
||||
|
||||
Please do be aware that this button is no substitute for human interaction in the case of a real emergency. How your printer responds to M112 depends entirely on its firmware.
|
@ -9,7 +9,9 @@ class EstopPlugin(octoprint.plugin.StartupPlugin,
|
||||
octoprint.plugin.SettingsPlugin):
|
||||
|
||||
def get_settings_defaults(self):
|
||||
return dict(estopCommand = "M112")
|
||||
return dict(
|
||||
estopCommand = "M112",
|
||||
estopReconnect = False)
|
||||
|
||||
def on_after_startup(self):
|
||||
self.estopCommand = self._settings.get(["estopCommand"])
|
||||
@ -23,9 +25,17 @@ class EstopPlugin(octoprint.plugin.StartupPlugin,
|
||||
)
|
||||
def get_template_configs(self):
|
||||
return [
|
||||
dict(type="sidebar", name="Emergency STOP!", icon="fa fa-print", template="estop_sidebar.jinja2", styles=["display: none"], data_bind="visible: loginState.isUser"),
|
||||
dict(type="sidebar", name="Emergency STOP!", icon="close", template="estop_sidebar.jinja2", styles=["display: none"], data_bind="visible: loginState.isUser"),
|
||||
dict(type="settings", name="E-Stop Settings", template="estop_settings.jinja2", custom_bindings=False)
|
||||
]
|
||||
|
||||
def on_settings_save(self, data):
|
||||
s = self._settings
|
||||
if "estopCommand" in data.keys():
|
||||
s.set(["estopCommand"], data["estopCommand"])
|
||||
if "estopReconnect" in data.keys():
|
||||
s.setBoolean(["estopReconnect"], data["estopReconnect"])
|
||||
s.save()
|
||||
|
||||
def get_update_information(self):
|
||||
return dict(
|
||||
|
@ -76,4 +76,11 @@
|
||||
}
|
||||
#sidebar_plugin_estop {
|
||||
display: block !important;
|
||||
}
|
||||
.estop-warning-icon {
|
||||
color: #eb0000;
|
||||
font-size: 2em !important;
|
||||
}
|
||||
.estop-warning {
|
||||
font-style: italic;
|
||||
}
|
@ -5,27 +5,41 @@
|
||||
$(function() {
|
||||
function EstopViewModel(parameters) {
|
||||
var self = this;
|
||||
|
||||
|
||||
self.loginState = parameters[0];
|
||||
self.printerState = parameters[1];
|
||||
self.settings = parameters[2];
|
||||
|
||||
self.estopCommand = ko.observable("M112");
|
||||
self.estopReconnect = ko.observable(false);
|
||||
self.emergencyCalled = ko.observable(false);
|
||||
|
||||
self.enableEstop = ko.pureComputed(function() {
|
||||
self.enableEstop = ko.pureComputed(function() {
|
||||
return self.printerState.isOperational() && self.loginState.isUser();
|
||||
});
|
||||
|
||||
self.estopState = ko.pureComputed(function() {
|
||||
return self.loginState.isUser() > 0 ? "estop_sidebar" : "estop_sidebar_disabled";
|
||||
});
|
||||
|
||||
self.reconnect = ko.pureComputed(function() {
|
||||
return self.estopReconnect() && self.emergencyCalled();
|
||||
|
||||
})
|
||||
|
||||
self.buttonText = ko.pureComputed(function() {
|
||||
if (self.enableEstop()) {
|
||||
return gettext("EMERGENCY STOP");
|
||||
} else {
|
||||
}
|
||||
else if (self.reconnect()) {
|
||||
return gettext("Reconnecting...")
|
||||
}
|
||||
else if (!self.enableEstop()) {
|
||||
return gettext("Offline");
|
||||
}
|
||||
else {
|
||||
return gettext("Unknown Status");
|
||||
}
|
||||
});
|
||||
|
||||
self.buttonTitle = ko.pureComputed(function() {
|
||||
@ -34,22 +48,46 @@ $(function() {
|
||||
});
|
||||
|
||||
self.onBeforeBinding = function () {
|
||||
//self.estopCommand(self.settings.settings.plugins.estop.estopCommand());
|
||||
self.updateSettingsValues();
|
||||
}
|
||||
self.sendEstopCommand = function () {
|
||||
if (self.enableEstop()) {
|
||||
self.onSettingsHidden = function () {
|
||||
self.updateSettingsValues();
|
||||
}
|
||||
|
||||
self.updateSettingsValues = function () { //lazy way of making sure we have the latest version of the settings
|
||||
self.estopCommand(self.settings.settings.plugins.estop.estopCommand());
|
||||
self.estopReconnect(self.settings.settings.plugins.estop.estopReconnect());
|
||||
}
|
||||
|
||||
self.onEventDisconnected = function () {
|
||||
if (self.estopReconnect() && self.emergencyCalled()) {
|
||||
self.timedReconnect = setTimeout(function() { //reconnect 3 seconds after detecting the printer is offline
|
||||
self.emergencyCalled(false);
|
||||
OctoPrint.connection.connect();
|
||||
|
||||
}, 3*1000); //3 seconds
|
||||
}
|
||||
}
|
||||
|
||||
self.sendEstopCommand = function () {
|
||||
if (self.enableEstop()) {
|
||||
self.estopCommand(self.settings.settings.plugins.estop.estopCommand());
|
||||
OctoPrint.control.sendGcode(self.estopCommand());
|
||||
};
|
||||
};
|
||||
|
||||
if (self.estopReconnect()) {
|
||||
self.emergencyCalled(true);
|
||||
OctoPrint.connection.disconnect(); //normally octoprint would probably disconnect anyway, just calling this here in case the printer is in a blocking loop
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
OCTOPRINT_VIEWMODELS.push({
|
||||
OCTOPRINT_VIEWMODELS.push({
|
||||
construct: EstopViewModel,
|
||||
dependencies: [
|
||||
"loginStateViewModel",
|
||||
"printerStateViewModel",
|
||||
"settingsViewModel"],
|
||||
"loginStateViewModel",
|
||||
"printerStateViewModel",
|
||||
"settingsViewModel"],
|
||||
elements: ["#sidebar_plugin_estop_wrapper"]
|
||||
});
|
||||
});
|
||||
|
@ -9,5 +9,14 @@
|
||||
<span class="help-block">Usually this is M112. Only change if you know what you're doing.</span>
|
||||
</div>
|
||||
</div>
|
||||
<div class="control-group">
|
||||
<label class="control-label">{{ _('Cycle the connection?') }}</label>
|
||||
<div class="controls">
|
||||
<input type="checkbox" class="input-block" data-bind="checked: settings.plugins.estop.estopReconnect">
|
||||
<span class="help-block">Enabling this will attempt to automatically cycle the connection to the printer. This may cause the printer's control board to be reset and may help break out of blocking commands. Waits 3 seconds after the printer is "offline" before reconnecting.</span>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
<span class="fa fa-exclamation-triangle estop-warning-icon"> </span>
|
||||
<span class="estop-warning">A software emergency stop button is no substitute for a proper emergency stop button that physically cuts the power to the printer. How the printer responds to emergency stop commands, and connection cycling, will depend entirely on the printer's controller board and firmware. Never leave a printer unattended for extended periods of time.</span>
|
||||
</div>
|
||||
|
2
setup.py
2
setup.py
@ -14,7 +14,7 @@ plugin_package = "octoprint_estop"
|
||||
plugin_name = "OctoPrint-Estop"
|
||||
|
||||
# The plugin's version. Can be overwritten within OctoPrint's internal data via __plugin_version__ in the plugin module
|
||||
plugin_version = "0.1.1"
|
||||
plugin_version = "0.1.2"
|
||||
|
||||
# The plugin's description. Can be overwritten within OctoPrint's internal data via __plugin_description__ in the plugin
|
||||
# module
|
||||
|
Reference in New Issue
Block a user