add some notifications about fan speed being altered

Added a popup notification (can be disabled) and some console log text if the fan speed is altered. Also made the slider snap to the min/max value if it is out of range to give visual feedback that the plugin is doing something to the fan speed.
This commit is contained in:
ntoff 2017-11-12 01:02:29 +10:00
parent 7bdd260617
commit f4bb25718a
3 changed files with 68 additions and 17 deletions

View File

@ -17,7 +17,8 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin,
return dict( return dict(
defaultFanSpeed=100, defaultFanSpeed=100,
minSpeed=0, minSpeed=0,
maxSpeed=100 maxSpeed=100,
notifyDelay=3000
) )
def on_settings_save(self, data): def on_settings_save(self, data):

View File

@ -5,29 +5,60 @@
$(function() { $(function() {
function FanSliderPluginViewModel(parameters) { function FanSliderPluginViewModel(parameters) {
//'use strict';
var self = this; var self = this;
self.settings = parameters[0]; self.settings = parameters[0];
self.control = parameters[1]; self.control = parameters[1];
self.loginState = parameters[2]; self.loginState = parameters[2];
fanSpeed = ko.observable(undefined); //fanSpeed = ko.observable("0");
self.control.fanSpeed = new ko.observable("100");
self.control.minFanSpeed = new ko.observable("000");
self.control.maxFanSpeed = new ko.observable("100");
self.control.notifyDelay = new ko.observable("3000"); //time in milliseconds
//convert percentage into PWM self.showNotify = function(self,options) {
self.fanPWM = ko.pureComputed(function () { options.hide = true;
self.speed = fanSpeed() * 255 / 100 //don't forget to limit this to 2 decimal places at some point. options.title = "Fan Speed Control";
return self.speed; options.delay = self.control.notifyDelay();
options.type = "info";
if (options.delay != "0") {
new PNotify(options);
}
};
//send gcode to set fan speed TODO: not be a global function
sendFanSpeed = ko.pureComputed(function () {
self.speed = self.control.fanSpeed() * 255 / 100 //don't forget to limit this to 2 decimal places at some point.
if (self.control.fanSpeed() < self.control.minFanSpeed() && self.control.fanSpeed() != "0") {
self.control.fanSpeed(self.control.minFanSpeed());
var options = {
text: 'Fan speed increased to meet minimum requirement.',
}
self.showNotify(self,options);
console.log("Fan Speed Control Plugin: " + self.control.fanSpeed() + "% is less than the minimum speed set in the fan control settings, increasing to " + self.control.minFanSpeed() + "%");
}
else {
if (self.control.fanSpeed() > self.control.maxFanSpeed()) {
self.control.fanSpeed(self.control.maxFanSpeed());
var options = {
text: 'Fan speed decreased to meet minimum requirement.',
}
self.showNotify(self,options);
console.log("Fan Speed Control Plugin: " + self.control.fanSpeed() + "% is more than the maximum speed set in the fan control settings, decreasing to " + self.control.maxFanSpeed() + "%");
}
}
self.control.sendCustomCommand({ command: "M106 S" + self.speed });
}); });
//send gcode to set fan speed //ph34r
sendFanSpeed = function () {
self.control.sendCustomCommand({ command: "M106 S" + self.fanPWM() });
};
try { try {
//extra classes //extra classes, I hate using this but it makes finding the buttons easier
$("#control > div.jog-panel").eq(0).addClass("controls"); $("#control > div.jog-panel").eq(0).addClass("controls");
$("#control > div.jog-panel").eq(1).addClass("tools"); $("#control > div.jog-panel").eq(1).addClass("tools");
$("#control > div.jog-panel").eq(2).addClass("general"); $("#control > div.jog-panel").eq(2).addClass("general");
//If !TouchUI then remove standard buttons + add slider + new buttons //If not TouchUI then remove standard buttons + add slider + new buttons
if ($("#touch body").length ==0 ) { if ($("#touch body").length ==0 ) {
//add ID to buttons //add ID to buttons
$("#control > div.general").find("button").eq(0).attr("id", "motors-off"); $("#control > div.general").find("button").eq(0).attr("id", "motors-off");
@ -39,7 +70,7 @@ $(function() {
//add new fan controls //add new fan controls
$("#control > div.jog-panel.general").find("button").eq(0).before("\ $("#control > div.jog-panel.general").find("button").eq(0).before("\
<input type=\"number\" style=\"width: 90px\" data-bind=\"slider: {min: 00, max: 100, step: 1, value: fanSpeed, tooltip: 'hide'}\">\ <input type=\"number\" style=\"width: 90px\" data-bind=\"slider: {min: 00, max: 100, step: 1, value: fanSpeed, tooltip: 'hide'}\">\
<button class=\"btn btn-block control-box\" data-bind=\"enable: isOperational() && loginState.isUser(), click: function() { sendFanSpeed() }\">" + gettext("Fan on") + ":<span data-bind=\"text: fanSpeed() + '%'\"></span></button>\ <button class=\"btn btn-block control-box\" data-bind=\"enable: isOperational() && loginState.isUser(), click: function() { sendFanSpeed() }\">" + gettext("Fan") + ":<span data-bind=\"text: fanSpeed() + '%'\"></span></button>\
<button class=\"btn btn-block control-box\" data-bind=\"enable: isOperational() && loginState.isUser(), click: function() { $root.sendCustomCommand({ type: 'command', commands: ['M106 S0'] }) }\">" + gettext("Fan off") + "</button>\ <button class=\"btn btn-block control-box\" data-bind=\"enable: isOperational() && loginState.isUser(), click: function() { $root.sendCustomCommand({ type: 'command', commands: ['M106 S0'] }) }\">" + gettext("Fan off") + "</button>\
"); ");
} else { //if TouchUI is active we only add the speed input + fan on button in a new section. } else { //if TouchUI is active we only add the speed input + fan on button in a new section.
@ -59,7 +90,16 @@ $(function() {
} }
//retrieve settings //retrieve settings
self.onBeforeBinding = function() { self.onBeforeBinding = function() {
fanSpeed(self.settings.settings.plugins.fanspeedslider.defaultFanSpeed()); self.control.fanSpeed(self.settings.settings.plugins.fanspeedslider.defaultFanSpeed());
self.control.minFanSpeed(self.settings.settings.plugins.fanspeedslider.minSpeed());
self.control.maxFanSpeed(self.settings.settings.plugins.fanspeedslider.maxSpeed());
self.control.notifyDelay(self.settings.settings.plugins.fanspeedslider.notifyDelay());
}
//update settings in case user changes them, otherwise a refresh of the UI is required
self.onSettingsHidden = function() {
self.control.minFanSpeed(self.settings.settings.plugins.fanspeedslider.minSpeed());
self.control.maxFanSpeed(self.settings.settings.plugins.fanspeedslider.maxSpeed());
self.control.notifyDelay(self.settings.settings.plugins.fanspeedslider.notifyDelay());
} }
} }
@ -69,5 +109,5 @@ $(function() {
dependencies: ["settingsViewModel", "controlViewModel", "loginStateViewModel"], dependencies: ["settingsViewModel", "controlViewModel", "loginStateViewModel"],
optional: [], optional: [],
elements: [] elements: []
}); });
}); });

View File

@ -1,12 +1,11 @@
<h3>{{ _('Fan Speed Control') }}</h3> <h3>{{ _('Fan Speed Control') }}</h3>
<div> <div>
<form class="form-horizontal"> <form class="form-horizontal">
<p>{{ _('Set the default value for the speed slider.') }}</p>
<div class="control-group"> <div class="control-group">
<label class="control-label">{{ _('Default Value') }}</label> <label class="control-label">{{ _('Default Value') }}</label>
<div class="controls"> <div class="controls">
<div class="input-append"> <div class="input-append">
<input type="number" min="0" max="100" class="input-mini" data-bind="value: settings.plugins.fanspeedslider.defaultFanSpeed"> <input type="number" min="0" max="100" class="input-mini" data-bind="attr: {title: 'This is the value the slider will default to when the UI is loaded / refreshed.' }, value: settings.plugins.fanspeedslider.defaultFanSpeed">
<span class="add-on">%</span> <span class="add-on">%</span>
</div> </div>
<span class="help-block">{{ _('The default value the slider will be set to when opening OctoPrint\'s UI') }}</span> <span class="help-block">{{ _('The default value the slider will be set to when opening OctoPrint\'s UI') }}</span>
@ -34,5 +33,16 @@
</div> </div>
</div> </div>
<p><i>{{ _('NOTE: The min/max setting has no effect when you are printing from an SD card that is attached directly to the printer as the gcode does not pass through OctoPrint.') }}</i></p> <p><i>{{ _('NOTE: The min/max setting has no effect when you are printing from an SD card that is attached directly to the printer as the gcode does not pass through OctoPrint.') }}</i></p>
<h3>{{ _('Notification Auto Hide Delay') }}</h3>
<div class="control-group">
<label class="control-label">{{ _('Notification Autohide Delay') }}</label>
<div class="controls">
<div class="input-append">
<input type="number" min="0" class="input-mini" data-bind="attr: {title: 'The plugin will notify a user when the fan speed is automatically adjusted, this only applies to speeds set via the button in the UI. \n\nFan speeds sent via the terminal (and therefore any print job) won\'t trigger notification spam.' }, value: settings.plugins.fanspeedslider.notifyDelay">
<span class="add-on">ms</span>
</div>
<span class="help-block">{{ _('Delay (in milliseconds) before notifications are auto-hidden. Set to 0 to disable notifications.') }}</span>
</div>
</div>
</form> </form>
</div> </div>