diff --git a/octoprint_fanspeedslider/__init__.py b/octoprint_fanspeedslider/__init__.py index 7cb3e58..09d104b 100644 --- a/octoprint_fanspeedslider/__init__.py +++ b/octoprint_fanspeedslider/__init__.py @@ -1,6 +1,8 @@ # coding=utf-8 from __future__ import absolute_import +from decimal import * +import re import octoprint.plugin class FanSliderPlugin(octoprint.plugin.StartupPlugin, @@ -8,8 +10,19 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin, octoprint.plugin.SettingsPlugin, octoprint.plugin.AssetPlugin): + def on_after_startup(self): + self.get_settings_updates() + def get_settings_defaults(self): - return dict(fanSpeed=100) + return dict( + defaultFanSpeed=100, + minSpeed=0, + maxSpeed=100 + ) + + def on_settings_save(self, data): + octoprint.plugin.SettingsPlugin.on_settings_save(self, data) + self.get_settings_updates() def get_assets(self): return dict( @@ -20,12 +33,35 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin, def get_template_configs(self): return [ dict(type="settings", custom_bindings=False) - ] + ] + + def get_settings_updates(self): + self.defaultFanSpeed = self._settings.get(["defaultFanSpeed"]) + self.minSpeed = self._settings.get(["minSpeed"]) + self.maxSpeed = self._settings.get(["maxSpeed"]) + + getcontext().prec=5 #sets precision for "Decimal" not sure if this'll cause conflicts, ideas? + self.minPWM = round( Decimal(self.minSpeed) * Decimal(2.55), 2 ) + self.maxPWM = round( Decimal(self.maxSpeed) * Decimal(2.55), 2 ) + + def rewrite_m106(self, comm_instance, phase, cmd, cmd_type, gcode, *args, **kwargs): + if gcode and gcode.startswith('M106'): + fanPwm = re.search("S(\d+.\d+)", cmd) + if fanPwm and fanPwm.group(1): + fanPwm = fanPwm.group(1) + if Decimal(fanPwm) < self.minPWM and Decimal(fanPwm) != 0: + self._logger.info("fan pwm value " + str(fanPwm) + " is below threshold, increasing to " + str(self.minPWM)) + cmd = "M106 S" + str(self.minPWM) + return cmd, + elif Decimal(fanPwm) > self.maxPWM: + self._logger.info("fan pwm value " + str(fanPwm) + " is above threshold, decreasing to " + str(self.maxPWM)) + cmd = "M106 S" + str(self.maxPWM) + return cmd, def get_update_information(self): return dict( fanspeedslider=dict( - displayName="Fan Speed Slider", + displayName="Fan Speed Control", displayVersion=self._plugin_version, # version check: github repository @@ -38,8 +74,15 @@ class FanSliderPlugin(octoprint.plugin.StartupPlugin, pip="https://github.com/ntoff/OctoPrint-FanSpeedSlider/archive/{target_version}.zip" ) ) -__plugin_name__ = "Fan Speed Slider" -__plugin_implementation__ = FanSliderPlugin() -__plugin_hooks__ = { + +__plugin_name__ = "Fan Speed Control" + +def __plugin_load__(): + global __plugin_implementation__ + __plugin_implementation__ = __plugin_implementation__ = FanSliderPlugin() + + global __plugin_hooks__ + __plugin_hooks__ = { + "octoprint.comm.protocol.gcode.queuing": __plugin_implementation__.rewrite_m106, "octoprint.plugin.softwareupdate.check_config": __plugin_implementation__.get_update_information } \ No newline at end of file diff --git a/octoprint_fanspeedslider/static/js/fanslider.js b/octoprint_fanspeedslider/static/js/fanslider.js index efcd923..192e9c9 100644 --- a/octoprint_fanspeedslider/static/js/fanslider.js +++ b/octoprint_fanspeedslider/static/js/fanslider.js @@ -7,20 +7,20 @@ $(function() { function FanSliderPluginViewModel(parameters) { var self = this; - self.printerstate = parameters[0]; - self.loginstate = parameters[1]; - self.control = parameters[2]; - self.settings = parameters[3]; + self.settings = parameters[0]; + self.control = parameters[1]; + self.loginState = parameters[2]; + + fanSpeed = ko.observable(undefined); - //default to 100% fan speed - fanSpeed = ko.observable(undefined); //convert percentage into PWM - fanPWM = ko.pureComputed(function () { - return Math.round(fanSpeed() * 255 / 100); + self.fanPWM = ko.pureComputed(function () { + self.speed = fanSpeed() * 255 / 100 //don't forget to limit this to 2 decimal places at some point. + return self.speed; }); //send gcode to set fan speed sendFanSpeed = function () { - self.control.sendCustomCommand({ command: "M106 S" + fanPWM() }); + self.control.sendCustomCommand({ command: "M106 S" + self.fanPWM() }); }; //extra classes $("#control > div.jog-panel").eq(0).addClass("controls"); @@ -54,12 +54,11 @@ $(function() { } //retrieve settings self.onBeforeBinding = function() { - fanSpeed(self.settings.settings.plugins.fanspeedslider.fanSpeed()); + fanSpeed(self.settings.settings.plugins.fanspeedslider.defaultFanSpeed()); } } OCTOPRINT_VIEWMODELS.push([ FanSliderPluginViewModel, - - ["printerStateViewModel", "loginStateViewModel", "controlViewModel", "settingsViewModel"] + ["settingsViewModel", "controlViewModel", "loginStateViewModel"] ]); }); \ No newline at end of file diff --git a/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 b/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 index b23d2cf..c05a308 100644 --- a/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 +++ b/octoprint_fanspeedslider/templates/fanspeedslider_settings.jinja2 @@ -1,18 +1,38 @@ -
{{ _('Set the default value for the fan speed slider.') }}
-