diff --git a/.gitignore b/.gitignore index 9b9b4d6..b2f04b0 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ *.egg-info .DS_Store config.yaml +*new_stuff* diff --git a/octoprint_enclosure/__init__.py b/octoprint_enclosure/__init__.py index 387ab06..2a1f07b 100644 --- a/octoprint_enclosure/__init__.py +++ b/octoprint_enclosure/__init__.py @@ -3,43 +3,115 @@ from __future__ import absolute_import import octoprint.plugin import octoprint.util +from abc import ABC +from enum import Enum +from uuid import UUID, uuid4 -class EnclosurePlugin(octoprint.plugin.StartupPlugin, octoprint.plugin.TemplatePlugin, octoprint.plugin.SettingsPlugin, - octoprint.plugin.AssetPlugin, octoprint.plugin.BlueprintPlugin, +class OutputType(Enum): + ACTION_BASED_INPUT = 0 + STATE_BASED_INPUT = 1 + +class OutputPeripheral(ABC): + def __init__(self, id: UUID ,name:str, type:OutputType) -> None: + super().__init__() + + def run_action(self): + """ + Output peripheral can be action based when it's: + - GCODE command + - Shell script + + Returns: + Bool: Success + """ + pass + + def set_state(self, state): + """ + Output peripheral can be state based when it's: + - GPIO: it can be set to on / off / toggle + - Led Strip: it can be set to a color in RGB + - Neopixel + - PWM + + Returns: + Bool: Success + """ + pass + + +class EnclosurePlugin(octoprint.plugin.StartupPlugin, + octoprint.plugin.TemplatePlugin, + octoprint.plugin.SettingsPlugin, + octoprint.plugin.AssetPlugin, + octoprint.plugin.BlueprintPlugin, octoprint.plugin.EventHandlerPlugin): + def __init__(self): + super().__init__() + self._sub_plugins = dict() + # ~~ TemplatePlugin def get_template_configs(self): return [ - dict(type="settings", template="enclosure_settings.jinja2", - custom_bindings=True) + dict( + type="settings", + template="enclosure_settings.jinja2", + custom_bindings=True + ) ] # ~~ AssetPlugin mixin def get_assets(self): return dict( - js=["js/enclosure.js", "js/bootstrap-colorpicker.min.js"], - css=["css/bootstrap-colorpicker.css", "css/enclosure.css"]) + js=["js/enclosure.js", ], + css=["css/enclosure.css"] + ) # ~~ SettingsPlugin def get_settings_defaults(self): - return dict(enclosureOutputs=[], enclosureInputs=[]) + return dict() # ~~ SettingsPlugin mixin def on_settings_save(self, data): - enclosureOutputs = self._settings.get(["enclosureOutputs"]) - enclosureInputs = self._settings.get(["enclosureInputs"]) - print(data) + octoprint.plugin.SettingsPlugin.on_settings_save(self, data) # ~~ Softwareupdate hook def get_update_information(self): - return dict(enclosure=dict(displayName="Enclosure Plugin", displayVersion=self._plugin_version, - # version check: github repository - type="github_release", user="vitormhenrique", repo="OctoPrint-Enclosure", current=self._plugin_version, - # update method: pip - pip="https://github.com/vitormhenrique/OctoPrint-Enclosure/archive/{target_version}.zip")) + return dict( + enclosure=dict( + displayName="Enclosure Plugin", + displayVersion=self._plugin_version, + type="github_release", + user="vitormhenrique", + repo="OctoPrint-Enclosure", + current=self._plugin_version, + pip="https://github.com/vitormhenrique/OctoPrint-Enclosure/archive/{target_version}.zip" + ) + ) + + def _get_plugin_key(self, implementation): + for k, v in self._plugin_manager.plugin_implementations.items(): + if v == implementation: + return k + + + def register_plugin(self, implementation): + k = self._get_plugin_key(implementation) + + self._logger.debug("Registering plugin - {}".format(k)) + + if k not in self._sub_plugins: + self._logger.info("Registered plugin - {}".format(k)) + self._sub_plugins[k] = implementation + + def output_peripheral_set_state(self): + pass + + def register_output_peripheral(self): + pass __plugin_name__ = "Enclosure Plugin" @@ -52,6 +124,12 @@ def __plugin_load__(): global __plugin_hooks__ __plugin_hooks__ = { - # "octoprint.comm.protocol.gcode.queuing" : __plugin_implementation__.hook_gcode_queuing, "octoprint.plugin.softwareupdate.check_config": __plugin_implementation__.get_update_information } + + global __plugin_helpers__ + __plugin_helpers__ = dict( + output_peripheral_set_state = __plugin_implementation__.output_peripheral_set_state, + register_plugin = __plugin_implementation__.register_plugin, + register_output_peripheral = __plugin_implementation__.register_output_peripheral, + ) diff --git a/octoprint_enclosure/static/css/bootstrap-colorpicker.css b/octoprint_enclosure/static/css/bootstrap-colorpicker.css deleted file mode 100644 index 0dfa89c..0000000 --- a/octoprint_enclosure/static/css/bootstrap-colorpicker.css +++ /dev/null @@ -1,229 +0,0 @@ -/*! - * Bootstrap Colorpicker v2.5.1 - * https://itsjavi.com/bootstrap-colorpicker/ - * - * Originally written by (c) 2012 Stefan Petre - * Licensed under the Apache License v2.0 - * http://www.apache.org/licenses/LICENSE-2.0.txt - * - */ -.colorpicker-saturation { - width: 100px; - height: 100px; - background-image: url("../img/bootstrap-colorpicker/saturation.png"); - cursor: crosshair; - float: left; -} -.colorpicker-saturation i { - display: block; - height: 5px; - width: 5px; - border: 1px solid #000; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; - position: absolute; - top: 0; - left: 0; - margin: -4px 0 0 -4px; -} -.colorpicker-saturation i b { - display: block; - height: 5px; - width: 5px; - border: 1px solid #fff; - -webkit-border-radius: 5px; - -moz-border-radius: 5px; - border-radius: 5px; -} -.colorpicker-hue, -.colorpicker-alpha { - width: 15px; - height: 100px; - float: left; - cursor: row-resize; - margin-left: 4px; - margin-bottom: 4px; -} -.colorpicker-hue i, -.colorpicker-alpha i { - display: block; - height: 1px; - background: #000; - border-top: 1px solid #fff; - position: absolute; - top: 0; - left: 0; - width: 100%; - margin-top: -1px; -} -.colorpicker-hue { - background-image: url("../img/bootstrap-colorpicker/hue.png"); -} -.colorpicker-alpha { - background-image: url("../img/bootstrap-colorpicker/alpha.png"); - display: none; -} -.colorpicker-saturation, -.colorpicker-hue, -.colorpicker-alpha { - background-size: contain; -} -.colorpicker { - padding: 4px; - min-width: 130px; - margin-top: 1px; - -webkit-border-radius: 4px; - -moz-border-radius: 4px; - border-radius: 4px; - z-index: 2500; -} -.colorpicker:before, -.colorpicker:after { - display: table; - content: ""; - line-height: 0; -} -.colorpicker:after { - clear: both; -} -.colorpicker:before { - content: ''; - display: inline-block; - border-left: 7px solid transparent; - border-right: 7px solid transparent; - border-bottom: 7px solid #ccc; - border-bottom-color: rgba(0, 0, 0, 0.2); - position: absolute; - top: -7px; - left: 6px; -} -.colorpicker:after { - content: ''; - display: inline-block; - border-left: 6px solid transparent; - border-right: 6px solid transparent; - border-bottom: 6px solid #ffffff; - position: absolute; - top: -6px; - left: 7px; -} -.colorpicker div { - position: relative; -} -.colorpicker.colorpicker-with-alpha { - min-width: 140px; -} -.colorpicker.colorpicker-with-alpha .colorpicker-alpha { - display: block; -} -.colorpicker-color { - height: 10px; - margin-top: 5px; - clear: both; - background-image: url("../img/bootstrap-colorpicker/alpha.png"); - background-position: 0 100%; -} -.colorpicker-color div { - height: 10px; -} -.colorpicker-selectors { - display: none; - height: 10px; - margin-top: 5px; - clear: both; -} -.colorpicker-selectors i { - cursor: pointer; - float: left; - height: 10px; - width: 10px; -} -.colorpicker-selectors i + i { - margin-left: 3px; -} -.colorpicker-element .input-group-addon i, -.colorpicker-element .add-on i { - display: inline-block; - cursor: pointer; - height: 16px; - vertical-align: text-top; - width: 16px; -} -.colorpicker.colorpicker-inline { - position: relative; - display: inline-block; - float: none; - z-index: auto; -} -.colorpicker.colorpicker-horizontal { - width: 110px; - min-width: 110px; - height: auto; -} -.colorpicker.colorpicker-horizontal .colorpicker-saturation { - margin-bottom: 4px; -} -.colorpicker.colorpicker-horizontal .colorpicker-color { - width: 100px; -} -.colorpicker.colorpicker-horizontal .colorpicker-hue, -.colorpicker.colorpicker-horizontal .colorpicker-alpha { - width: 100px; - height: 15px; - float: left; - cursor: col-resize; - margin-left: 0px; - margin-bottom: 4px; -} -.colorpicker.colorpicker-horizontal .colorpicker-hue i, -.colorpicker.colorpicker-horizontal .colorpicker-alpha i { - display: block; - height: 15px; - background: #ffffff; - position: absolute; - top: 0; - left: 0; - width: 1px; - border: none; - margin-top: 0px; -} -.colorpicker.colorpicker-horizontal .colorpicker-hue { - background-image: url("../img/bootstrap-colorpicker/hue-horizontal.png"); -} -.colorpicker.colorpicker-horizontal .colorpicker-alpha { - background-image: url("../img/bootstrap-colorpicker/alpha-horizontal.png"); -} -.colorpicker-right:before { - left: auto; - right: 6px; -} -.colorpicker-right:after { - left: auto; - right: 7px; -} -.colorpicker-no-arrow:before { - border-right: 0; - border-left: 0; -} -.colorpicker-no-arrow:after { - border-right: 0; - border-left: 0; -} -.colorpicker.colorpicker-visible, -.colorpicker-alpha.colorpicker-visible, -.colorpicker-saturation.colorpicker-visible, -.colorpicker-hue.colorpicker-visible, -.colorpicker-selectors.colorpicker-visible { - display: block; -} -.colorpicker.colorpicker-hidden, -.colorpicker-alpha.colorpicker-hidden, -.colorpicker-saturation.colorpicker-hidden, -.colorpicker-hue.colorpicker-hidden, -.colorpicker-selectors.colorpicker-hidden { - display: none; -} -.colorpicker-inline.colorpicker-visible { - display: inline-block; -} \ No newline at end of file diff --git a/octoprint_enclosure/static/img/bootstrap-colorpicker/alpha-horizontal.png b/octoprint_enclosure/static/img/bootstrap-colorpicker/alpha-horizontal.png deleted file mode 100644 index f831889..0000000 Binary files a/octoprint_enclosure/static/img/bootstrap-colorpicker/alpha-horizontal.png and /dev/null differ diff --git a/octoprint_enclosure/static/img/bootstrap-colorpicker/alpha.png b/octoprint_enclosure/static/img/bootstrap-colorpicker/alpha.png deleted file mode 100644 index 2e53a30..0000000 Binary files a/octoprint_enclosure/static/img/bootstrap-colorpicker/alpha.png and /dev/null differ diff --git a/octoprint_enclosure/static/img/bootstrap-colorpicker/hue-horizontal.png b/octoprint_enclosure/static/img/bootstrap-colorpicker/hue-horizontal.png deleted file mode 100644 index 3dcd594..0000000 Binary files a/octoprint_enclosure/static/img/bootstrap-colorpicker/hue-horizontal.png and /dev/null differ diff --git a/octoprint_enclosure/static/img/bootstrap-colorpicker/hue.png b/octoprint_enclosure/static/img/bootstrap-colorpicker/hue.png deleted file mode 100644 index 6f5ec2e..0000000 Binary files a/octoprint_enclosure/static/img/bootstrap-colorpicker/hue.png and /dev/null differ diff --git a/octoprint_enclosure/static/img/bootstrap-colorpicker/saturation.png b/octoprint_enclosure/static/img/bootstrap-colorpicker/saturation.png deleted file mode 100644 index 170841c..0000000 Binary files a/octoprint_enclosure/static/img/bootstrap-colorpicker/saturation.png and /dev/null differ diff --git a/octoprint_enclosure/static/js/bootstrap-colorpicker.min.js b/octoprint_enclosure/static/js/bootstrap-colorpicker.min.js deleted file mode 100644 index 7cd35b8..0000000 --- a/octoprint_enclosure/static/js/bootstrap-colorpicker.min.js +++ /dev/null @@ -1,5 +0,0 @@ -/*! - * Bootstrap Colorpicker v2.5.1 - * https://itsjavi.com/bootstrap-colorpicker/ - */ -!function(a,b){"function"==typeof define&&define.amd?define(["jquery"],function(a){return b(a)}):"object"==typeof exports?module.exports=b(require("jquery")):jQuery&&!jQuery.fn.colorpicker&&b(jQuery)}(this,function(a){"use strict";var b=function(c,d,e,f,g){this.fallbackValue=e?e&&"undefined"!=typeof e.h?e:this.value={h:0,s:0,b:0,a:1}:null,this.fallbackFormat=f?f:"rgba",this.hexNumberSignPrefix=g===!0,this.value=this.fallbackValue,this.origFormat=null,this.predefinedColors=d?d:{},this.colors=a.extend({},b.webColors,this.predefinedColors),c&&("undefined"!=typeof c.h?this.value=c:this.setColor(String(c))),this.value||(this.value={h:0,s:0,b:0,a:1})};b.webColors={aliceblue:"f0f8ff",antiquewhite:"faebd7",aqua:"00ffff",aquamarine:"7fffd4",azure:"f0ffff",beige:"f5f5dc",bisque:"ffe4c4",black:"000000",blanchedalmond:"ffebcd",blue:"0000ff",blueviolet:"8a2be2",brown:"a52a2a",burlywood:"deb887",cadetblue:"5f9ea0",chartreuse:"7fff00",chocolate:"d2691e",coral:"ff7f50",cornflowerblue:"6495ed",cornsilk:"fff8dc",crimson:"dc143c",cyan:"00ffff",darkblue:"00008b",darkcyan:"008b8b",darkgoldenrod:"b8860b",darkgray:"a9a9a9",darkgreen:"006400",darkkhaki:"bdb76b",darkmagenta:"8b008b",darkolivegreen:"556b2f",darkorange:"ff8c00",darkorchid:"9932cc",darkred:"8b0000",darksalmon:"e9967a",darkseagreen:"8fbc8f",darkslateblue:"483d8b",darkslategray:"2f4f4f",darkturquoise:"00ced1",darkviolet:"9400d3",deeppink:"ff1493",deepskyblue:"00bfff",dimgray:"696969",dodgerblue:"1e90ff",firebrick:"b22222",floralwhite:"fffaf0",forestgreen:"228b22",fuchsia:"ff00ff",gainsboro:"dcdcdc",ghostwhite:"f8f8ff",gold:"ffd700",goldenrod:"daa520",gray:"808080",green:"008000",greenyellow:"adff2f",honeydew:"f0fff0",hotpink:"ff69b4",indianred:"cd5c5c",indigo:"4b0082",ivory:"fffff0",khaki:"f0e68c",lavender:"e6e6fa",lavenderblush:"fff0f5",lawngreen:"7cfc00",lemonchiffon:"fffacd",lightblue:"add8e6",lightcoral:"f08080",lightcyan:"e0ffff",lightgoldenrodyellow:"fafad2",lightgrey:"d3d3d3",lightgreen:"90ee90",lightpink:"ffb6c1",lightsalmon:"ffa07a",lightseagreen:"20b2aa",lightskyblue:"87cefa",lightslategray:"778899",lightsteelblue:"b0c4de",lightyellow:"ffffe0",lime:"00ff00",limegreen:"32cd32",linen:"faf0e6",magenta:"ff00ff",maroon:"800000",mediumaquamarine:"66cdaa",mediumblue:"0000cd",mediumorchid:"ba55d3",mediumpurple:"9370d8",mediumseagreen:"3cb371",mediumslateblue:"7b68ee",mediumspringgreen:"00fa9a",mediumturquoise:"48d1cc",mediumvioletred:"c71585",midnightblue:"191970",mintcream:"f5fffa",mistyrose:"ffe4e1",moccasin:"ffe4b5",navajowhite:"ffdead",navy:"000080",oldlace:"fdf5e6",olive:"808000",olivedrab:"6b8e23",orange:"ffa500",orangered:"ff4500",orchid:"da70d6",palegoldenrod:"eee8aa",palegreen:"98fb98",paleturquoise:"afeeee",palevioletred:"d87093",papayawhip:"ffefd5",peachpuff:"ffdab9",peru:"cd853f",pink:"ffc0cb",plum:"dda0dd",powderblue:"b0e0e6",purple:"800080",red:"ff0000",rosybrown:"bc8f8f",royalblue:"4169e1",saddlebrown:"8b4513",salmon:"fa8072",sandybrown:"f4a460",seagreen:"2e8b57",seashell:"fff5ee",sienna:"a0522d",silver:"c0c0c0",skyblue:"87ceeb",slateblue:"6a5acd",slategray:"708090",snow:"fffafa",springgreen:"00ff7f",steelblue:"4682b4",tan:"d2b48c",teal:"008080",thistle:"d8bfd8",tomato:"ff6347",turquoise:"40e0d0",violet:"ee82ee",wheat:"f5deb3",white:"ffffff",whitesmoke:"f5f5f5",yellow:"ffff00",yellowgreen:"9acd32",transparent:"transparent"},b.prototype={constructor:b,colors:{},predefinedColors:{},getValue:function(){return this.value},setValue:function(a){this.value=a},_sanitizeNumber:function(a){return"number"==typeof a?a:isNaN(a)||null===a||""===a||void 0===a?1:""===a?0:"undefined"!=typeof a.toLowerCase?(a.match(/^\./)&&(a="0"+a),Math.ceil(100*parseFloat(a))/100):1},isTransparent:function(a){return!(!a||!("string"==typeof a||a instanceof String))&&(a=a.toLowerCase().trim(),"transparent"===a||a.match(/#?00000000/)||a.match(/(rgba|hsla)\(0,0,0,0?\.?0\)/))},rgbaIsTransparent:function(a){return 0===a.r&&0===a.g&&0===a.b&&0===a.a},setColor:function(a){if(a=a.toLowerCase().trim()){if(this.isTransparent(a))return this.value={h:0,s:0,b:0,a:0},!0;var b=this.parse(a);b?(this.value=this.value={h:b.h,s:b.s,b:b.b,a:b.a},this.origFormat||(this.origFormat=b.format)):this.fallbackValue&&(this.value=this.fallbackValue)}return!1},setHue:function(a){this.value.h=1-a},setSaturation:function(a){this.value.s=a},setBrightness:function(a){this.value.b=1-a},setAlpha:function(a){this.value.a=Math.round(parseInt(100*(1-a),10)/100*100)/100},toRGB:function(a,b,c,d){0===arguments.length&&(a=this.value.h,b=this.value.s,c=this.value.b,d=this.value.a),a*=360;var e,f,g,h,i;return a=a%360/60,i=c*b,h=i*(1-Math.abs(a%2-1)),e=f=g=c-i,a=~~a,e+=[i,h,0,0,h,i][a],f+=[h,i,i,h,0,0][a],g+=[0,0,h,i,i,h][a],{r:Math.round(255*e),g:Math.round(255*f),b:Math.round(255*g),a:d}},toHex:function(a,b,c,d){0===arguments.length&&(a=this.value.h,b=this.value.s,c=this.value.b,d=this.value.a);var e=this.toRGB(a,b,c,d);if(this.rgbaIsTransparent(e))return"transparent";var f=(this.hexNumberSignPrefix?"#":"")+((1<<24)+(parseInt(e.r)<<16)+(parseInt(e.g)<<8)+parseInt(e.b)).toString(16).slice(1);return f},toHSL:function(a,b,c,d){0===arguments.length&&(a=this.value.h,b=this.value.s,c=this.value.b,d=this.value.a);var e=a,f=(2-b)*c,g=b*c;return g/=f>0&&f<=1?f:2-f,f/=2,g>1&&(g=1),{h:isNaN(e)?0:e,s:isNaN(g)?0:g,l:isNaN(f)?0:f,a:isNaN(d)?0:d}},toAlias:function(a,b,c,d){var e,f=0===arguments.length?this.toHex():this.toHex(a,b,c,d),g="alias"===this.origFormat?f:this.toString(this.origFormat,!1);for(var h in this.colors)if(e=this.colors[h].toLowerCase().trim(),e===f||e===g)return h;return!1},RGBtoHSB:function(a,b,c,d){a/=255,b/=255,c/=255;var e,f,g,h;return g=Math.max(a,b,c),h=g-Math.min(a,b,c),e=0===h?null:g===a?(b-c)/h:g===b?(c-a)/h+2:(a-b)/h+4,e=(e+360)%6*60/360,f=0===h?0:h/g,{h:this._sanitizeNumber(e),s:f,b:g,a:this._sanitizeNumber(d)}},HueToRGB:function(a,b,c){return c<0?c+=1:c>1&&(c-=1),6*c<1?a+(b-a)*c*6:2*c<1?b:3*c<2?a+(b-a)*(2/3-c)*6:a},HSLtoRGB:function(a,b,c,d){b<0&&(b=0);var e;e=c<=.5?c*(1+b):c+b-c*b;var f=2*c-e,g=a+1/3,h=a,i=a-1/3,j=Math.round(255*this.HueToRGB(f,e,g)),k=Math.round(255*this.HueToRGB(f,e,h)),l=Math.round(255*this.HueToRGB(f,e,i));return[j,k,l,this._sanitizeNumber(d)]},parse:function(b){if(0===arguments.length)return!1;var c,d,e=this,f=!1,g="undefined"!=typeof this.colors[b];return g&&(b=this.colors[b].toLowerCase().trim()),a.each(this.stringParsers,function(a,h){var i=h.re.exec(b);return c=i&&h.parse.apply(e,[i]),!c||(f={},d=g?"alias":h.format?h.format:e.getValidFallbackFormat(),f=d.match(/hsla?/)?e.RGBtoHSB.apply(e,e.HSLtoRGB.apply(e,c)):e.RGBtoHSB.apply(e,c),f instanceof Object&&(f.format=d),!1)}),f},getValidFallbackFormat:function(){var a=["rgba","rgb","hex","hsla","hsl"];return this.origFormat&&a.indexOf(this.origFormat)!==-1?this.origFormat:this.fallbackFormat&&a.indexOf(this.fallbackFormat)!==-1?this.fallbackFormat:"rgba"},toString:function(a,c){a=a||this.origFormat||this.fallbackFormat,c=c||!1;var d=!1;switch(a){case"rgb":return d=this.toRGB(),this.rgbaIsTransparent(d)?"transparent":"rgb("+d.r+","+d.g+","+d.b+")";case"rgba":return d=this.toRGB(),"rgba("+d.r+","+d.g+","+d.b+","+d.a+")";case"hsl":return d=this.toHSL(),"hsl("+Math.round(360*d.h)+","+Math.round(100*d.s)+"%,"+Math.round(100*d.l)+"%)";case"hsla":return d=this.toHSL(),"hsla("+Math.round(360*d.h)+","+Math.round(100*d.s)+"%,"+Math.round(100*d.l)+"%,"+d.a+")";case"hex":return this.toHex();case"alias":return d=this.toAlias(),d===!1?this.toString(this.getValidFallbackFormat()):c&&!(d in b.webColors)&&d in this.predefinedColors?this.predefinedColors[d]:d;default:return d}},stringParsers:[{re:/rgb\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*?\)/,format:"rgb",parse:function(a){return[a[1],a[2],a[3],1]}},{re:/rgb\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/,format:"rgb",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],1]}},{re:/rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[a[1],a[2],a[3],a[4]]}},{re:/rgba\(\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"rgba",parse:function(a){return[2.55*a[1],2.55*a[2],2.55*a[3],a[4]]}},{re:/hsl\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*?\)/,format:"hsl",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/hsla\(\s*(\d*(?:\.\d+)?)\s*,\s*(\d*(?:\.\d+)?)\%\s*,\s*(\d*(?:\.\d+)?)\%\s*(?:,\s*(\d*(?:\.\d+)?)\s*)?\)/,format:"hsla",parse:function(a){return[a[1]/360,a[2]/100,a[3]/100,a[4]]}},{re:/#?([a-fA-F0-9]{2})([a-fA-F0-9]{2})([a-fA-F0-9]{2})/,format:"hex",parse:function(a){return[parseInt(a[1],16),parseInt(a[2],16),parseInt(a[3],16),1]}},{re:/#?([a-fA-F0-9])([a-fA-F0-9])([a-fA-F0-9])/,format:"hex",parse:function(a){return[parseInt(a[1]+a[1],16),parseInt(a[2]+a[2],16),parseInt(a[3]+a[3],16),1]}}],colorNameToHex:function(a){return"undefined"!=typeof this.colors[a.toLowerCase()]&&this.colors[a.toLowerCase()]}};var c={horizontal:!1,inline:!1,color:!1,format:!1,input:"input",container:!1,component:".add-on, .input-group-addon",fallbackColor:!1,fallbackFormat:"hex",hexNumberSignPrefix:!0,sliders:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setHue"},alpha:{maxLeft:0,maxTop:100,callLeft:!1,callTop:"setAlpha"}},slidersHorz:{saturation:{maxLeft:100,maxTop:100,callLeft:"setSaturation",callTop:"setBrightness"},hue:{maxLeft:100,maxTop:0,callLeft:"setHue",callTop:!1},alpha:{maxLeft:100,maxTop:0,callLeft:"setAlpha",callTop:!1}},template:'
',align:"right",customClass:null,colorSelectors:null},d=function(b,d){this.element=a(b).addClass("colorpicker-element"),this.options=a.extend(!0,{},c,this.element.data(),d),this.component=this.options.component,this.component=this.component!==!1&&this.element.find(this.component),this.component&&0===this.component.length&&(this.component=!1),this.container=this.options.container===!0?this.element:this.options.container,this.container=this.container!==!1&&a(this.container),this.input=this.element.is("input")?this.element:!!this.options.input&&this.element.find(this.options.input),this.input&&0===this.input.length&&(this.input=!1),this.color=this.createColor(this.options.color!==!1?this.options.color:this.getValue()),this.format=this.options.format!==!1?this.options.format:this.color.origFormat,this.options.color!==!1&&(this.updateInput(this.color),this.updateData(this.color));var e=this.picker=a(this.options.template);if(this.options.customClass&&e.addClass(this.options.customClass),this.options.inline?e.addClass("colorpicker-inline colorpicker-visible"):e.addClass("colorpicker-hidden"),this.options.horizontal&&e.addClass("colorpicker-horizontal"),["rgba","hsla","alias"].indexOf(this.format)===-1&&this.options.format!==!1&&"transparent"!==this.getValue()||e.addClass("colorpicker-with-alpha"),"right"===this.options.align&&e.addClass("colorpicker-right"),this.options.inline===!0&&e.addClass("colorpicker-no-arrow"),this.options.colorSelectors){var f=this,g=f.picker.find(".colorpicker-selectors");g.length>0&&(a.each(this.options.colorSelectors,function(b,c){var d=a("").addClass("colorpicker-selectors-color").css("background-color",c).data("class",b).data("alias",b);d.on("mousedown.colorpicker touchstart.colorpicker",function(b){b.preventDefault(),f.setValue("alias"===f.format?a(this).data("alias"):a(this).css("background-color"))}),g.append(d)}),g.show().addClass("colorpicker-visible"))}e.on("mousedown.colorpicker touchstart.colorpicker",a.proxy(function(a){a.target===a.currentTarget&&a.preventDefault()},this)),e.find(".colorpicker-saturation, .colorpicker-hue, .colorpicker-alpha").on("mousedown.colorpicker touchstart.colorpicker",a.proxy(this.mousedown,this)),e.appendTo(this.container?this.container:a("body")),this.input!==!1&&(this.input.on({"keyup.colorpicker":a.proxy(this.keyup,this)}),this.input.on({"change.colorpicker":a.proxy(this.change,this)}),this.component===!1&&this.element.on({"focus.colorpicker":a.proxy(this.show,this)}),this.options.inline===!1&&this.element.on({"focusout.colorpicker":a.proxy(this.hide,this)})),this.component!==!1&&this.component.on({"click.colorpicker":a.proxy(this.show,this)}),this.input===!1&&this.component===!1&&this.element.on({"click.colorpicker":a.proxy(this.show,this)}),this.input!==!1&&this.component!==!1&&"color"===this.input.attr("type")&&this.input.on({"click.colorpicker":a.proxy(this.show,this),"focus.colorpicker":a.proxy(this.show,this)}),this.update(),a(a.proxy(function(){this.element.trigger("create")},this))};d.Color=b,d.prototype={constructor:d,destroy:function(){this.picker.remove(),this.element.removeData("colorpicker","color").off(".colorpicker"),this.input!==!1&&this.input.off(".colorpicker"),this.component!==!1&&this.component.off(".colorpicker"),this.element.removeClass("colorpicker-element"),this.element.trigger({type:"destroy"})},reposition:function(){if(this.options.inline!==!1||this.options.container)return!1;var a=this.container&&this.container[0]!==window.document.body?"position":"offset",b=this.component||this.element,c=b[a]();"right"===this.options.align&&(c.left-=this.picker.outerWidth()-b.outerWidth()),this.picker.css({top:c.top+b.outerHeight(),left:c.left})},show:function(b){this.isDisabled()||(this.picker.addClass("colorpicker-visible").removeClass("colorpicker-hidden"),this.reposition(),a(window).on("resize.colorpicker",a.proxy(this.reposition,this)),!b||this.hasInput()&&"color"!==this.input.attr("type")||b.stopPropagation&&b.preventDefault&&(b.stopPropagation(),b.preventDefault()),!this.component&&this.input||this.options.inline!==!1||a(window.document).on({"mousedown.colorpicker":a.proxy(this.hide,this)}),this.element.trigger({type:"showPicker",color:this.color}))},hide:function(b){return("undefined"==typeof b||!b.target||!(a(b.currentTarget).parents(".colorpicker").length>0||a(b.target).parents(".colorpicker").length>0))&&(this.picker.addClass("colorpicker-hidden").removeClass("colorpicker-visible"),a(window).off("resize.colorpicker",this.reposition),a(window.document).off({"mousedown.colorpicker":this.hide}),this.update(),void this.element.trigger({type:"hidePicker",color:this.color}))},updateData:function(a){return a=a||this.color.toString(this.format,!1),this.element.data("color",a),a},updateInput:function(a){return a=a||this.color.toString(this.format,!1),this.input!==!1&&(this.input.prop("value",a),this.input.trigger("change")),a},updatePicker:function(a){"undefined"!=typeof a&&(this.color=this.createColor(a));var b=this.options.horizontal===!1?this.options.sliders:this.options.slidersHorz,c=this.picker.find("i");if(0!==c.length)return this.options.horizontal===!1?(b=this.options.sliders,c.eq(1).css("top",b.hue.maxTop*(1-this.color.value.h)).end().eq(2).css("top",b.alpha.maxTop*(1-this.color.value.a))):(b=this.options.slidersHorz,c.eq(1).css("left",b.hue.maxLeft*(1-this.color.value.h)).end().eq(2).css("left",b.alpha.maxLeft*(1-this.color.value.a))),c.eq(0).css({top:b.saturation.maxTop-this.color.value.b*b.saturation.maxTop,left:this.color.value.s*b.saturation.maxLeft}),this.picker.find(".colorpicker-saturation").css("backgroundColor",(this.options.hexNumberSignPrefix?"":"#")+this.color.toHex(this.color.value.h,1,1,1)),this.picker.find(".colorpicker-alpha").css("backgroundColor",(this.options.hexNumberSignPrefix?"":"#")+this.color.toHex()),this.picker.find(".colorpicker-color, .colorpicker-color div").css("backgroundColor",this.color.toString(this.format,!0)),a},updateComponent:function(a){var b;if(b="undefined"!=typeof a?this.createColor(a):this.color,this.component!==!1){var c=this.component.find("i").eq(0);c.length>0?c.css({backgroundColor:b.toString(this.format,!0)}):this.component.css({backgroundColor:b.toString(this.format,!0)})}return b.toString(this.format,!1)},update:function(a){var b;return this.getValue(!1)===!1&&a!==!0||(b=this.updateComponent(),this.updateInput(b),this.updateData(b),this.updatePicker()),b},setValue:function(a){this.color=this.createColor(a),this.update(!0),this.element.trigger({type:"changeColor",color:this.color,value:a})},createColor:function(a){return new b(a?a:null,this.options.colorSelectors,this.options.fallbackColor?this.options.fallbackColor:this.color,this.options.fallbackFormat,this.options.hexNumberSignPrefix)},getValue:function(a){a="undefined"==typeof a?this.options.fallbackColor:a;var b;return b=this.hasInput()?this.input.val():this.element.data("color"),void 0!==b&&""!==b&&null!==b||(b=a),b},hasInput:function(){return this.input!==!1},isDisabled:function(){return!!this.hasInput()&&this.input.prop("disabled")===!0},disable:function(){return!!this.hasInput()&&(this.input.prop("disabled",!0),this.element.trigger({type:"disable",color:this.color,value:this.getValue()}),!0)},enable:function(){return!!this.hasInput()&&(this.input.prop("disabled",!1),this.element.trigger({type:"enable",color:this.color,value:this.getValue()}),!0)},currentSlider:null,mousePointer:{left:0,top:0},mousedown:function(b){!b.pageX&&!b.pageY&&b.originalEvent&&b.originalEvent.touches&&(b.pageX=b.originalEvent.touches[0].pageX,b.pageY=b.originalEvent.touches[0].pageY),b.stopPropagation(),b.preventDefault();var c=a(b.target),d=c.closest("div"),e=this.options.horizontal?this.options.slidersHorz:this.options.sliders;if(!d.is(".colorpicker")){if(d.is(".colorpicker-saturation"))this.currentSlider=a.extend({},e.saturation);else if(d.is(".colorpicker-hue"))this.currentSlider=a.extend({},e.hue);else{if(!d.is(".colorpicker-alpha"))return!1;this.currentSlider=a.extend({},e.alpha)}var f=d.offset();this.currentSlider.guide=d.find("i")[0].style,this.currentSlider.left=b.pageX-f.left,this.currentSlider.top=b.pageY-f.top,this.mousePointer={left:b.pageX,top:b.pageY},a(window.document).on({"mousemove.colorpicker":a.proxy(this.mousemove,this),"touchmove.colorpicker":a.proxy(this.mousemove,this),"mouseup.colorpicker":a.proxy(this.mouseup,this),"touchend.colorpicker":a.proxy(this.mouseup,this)}).trigger("mousemove")}return!1},mousemove:function(a){!a.pageX&&!a.pageY&&a.originalEvent&&a.originalEvent.touches&&(a.pageX=a.originalEvent.touches[0].pageX,a.pageY=a.originalEvent.touches[0].pageY),a.stopPropagation(),a.preventDefault();var b=Math.max(0,Math.min(this.currentSlider.maxLeft,this.currentSlider.left+((a.pageX||this.mousePointer.left)-this.mousePointer.left))),c=Math.max(0,Math.min(this.currentSlider.maxTop,this.currentSlider.top+((a.pageY||this.mousePointer.top)-this.mousePointer.top)));return this.currentSlider.guide.left=b+"px",this.currentSlider.guide.top=c+"px",this.currentSlider.callLeft&&this.color[this.currentSlider.callLeft].call(this.color,b/this.currentSlider.maxLeft),this.currentSlider.callTop&&this.color[this.currentSlider.callTop].call(this.color,c/this.currentSlider.maxTop),this.options.format!==!1||"setAlpha"!==this.currentSlider.callTop&&"setAlpha"!==this.currentSlider.callLeft||(1!==this.color.value.a?(this.format="rgba",this.color.origFormat="rgba"):(this.format="hex",this.color.origFormat="hex")),this.update(!0),this.element.trigger({type:"changeColor",color:this.color}),!1},mouseup:function(b){return b.stopPropagation(),b.preventDefault(),a(window.document).off({"mousemove.colorpicker":this.mousemove,"touchmove.colorpicker":this.mousemove,"mouseup.colorpicker":this.mouseup,"touchend.colorpicker":this.mouseup}),!1},change:function(a){this.keyup(a)},keyup:function(a){38===a.keyCode?(this.color.value.a<1&&(this.color.value.a=Math.round(100*(this.color.value.a+.01))/100),this.update(!0)):40===a.keyCode?(this.color.value.a>0&&(this.color.value.a=Math.round(100*(this.color.value.a-.01))/100),this.update(!0)):(this.color=this.createColor(this.input.val()),this.color.origFormat&&this.options.format===!1&&(this.format=this.color.origFormat),this.getValue(!1)!==!1&&(this.updateData(),this.updateComponent(),this.updatePicker())),this.element.trigger({type:"changeColor",color:this.color,value:this.input.val()})}},a.colorpicker=d,a.fn.colorpicker=function(b){var c=Array.prototype.slice.call(arguments,1),e=1===this.length,f=null,g=this.each(function(){var e=a(this),g=e.data("colorpicker"),h="object"==typeof b?b:{};g||(g=new d(this,h),e.data("colorpicker",g)),"string"==typeof b?a.isFunction(g[b])?f=g[b].apply(g,c):(c.length&&(g[b]=c[0]),f=g[b]):f=e});return e?f:g},a.fn.colorpicker.constructor=d}); \ No newline at end of file diff --git a/octoprint_enclosure/static/js/enclosure.js b/octoprint_enclosure/static/js/enclosure.js index 2fc0512..f4df1b9 100644 --- a/octoprint_enclosure/static/js/enclosure.js +++ b/octoprint_enclosure/static/js/enclosure.js @@ -1,426 +1,5 @@ -function isInteger(value) { - return /^\d+$/.test(value); -} $(function () { - - var cleanInput = function (index_id) { - return { - index_id: index_id, - label: "", - input_type: "regular_gpio", - action_type: "output_control", - gpio: { - pin_name: "", - pull_resistor: "input_pull_up", - linked_action: "output_control", - edge_detection: "fall", - }, - linked_printer_action: { - action: "filament", - filament_sensor_enabled: false, - filament_sensor_timeout: 120, - }, - linked_output_action: { - output_index_id: "", - output_set_value: "low", - }, - temperature_sensor: { - type: "si7021", - address: "", - unit: "celsius", - } - } - }; - - var cleanOutput = function (index_id) { - return { - index_id: index_id, - label: "", - output_type: "regular_gpio", - gpio: { - pin_name: "", - active_low: false, - }, - gcode: { - gcode: "", - }, - neopixel: { - count: "", - brightness: "", - default_color: "", - }, - other_config: { - hide_on_tab: false, - show_on_navbar: false, - }, - pwm: { - linked_to_temperature: false, - duty_a: "", - temperature_a: "", - duty_b: "", - temperature_b: "", - frequency: "", - default_duty_cycle: "", - linked_temp_sensor: "", - }, - led_strip: { - clock_pin: "", - data_pin: "", - default_color: "", - }, - schedule: { - toggle_timer: false, - time_on: "", - time_off: "", - startup_with_server: false, - auto_startup: false, - startup_time_delay: "", - auto_shutdown: false, - shutdown_on_failed: false, - shutdown_time_delay: "", - }, - shell_script: { - shell_script: "", - }, - temperature_alarm: { - linked_temp_sensor: "", - set_temp: "", - controlled_io: "", - controlled_io_set_value: "high", - }, - temperature_control: { - linked_temp_sensor: "", - control_type: "heater", - default_value: "", - deadband: "", - max_temperature: "", - } - } - }; - - function EnclosureInputEditorViewModel(parameters) { - var self = this; - - self.isNew = ko.observable(false); - // general info - self.index_id = ko.observable(); - self.label = ko.observable(); - self.input_type = ko.observable(); - self.action_type = ko.observable(); - // gpio output - self.gpio_pin = ko.observable(); - self.pull_resistor = ko.observable(); - self.linked_action = ko.observable(); - self.edge_detection = ko.observable(); - // output on linked action - self.controlled_output = ko.observable(); - self.controlled_output_set_value = ko.observable(); - // printer action on linked action - self.printer_action = ko.observable(); - self.filament_sensor_enabled = ko.observable(); - self.filament_sensor_timeout = ko.observable(); - // temperature sensor - self.temperature_sensor_type = ko.observable(); - self.temperature_sensor_address = ko.observable(); - self.temperature_sensor_unit = ko.observable(); - - self.enclosureInputs = undefined; - - self.validInput = ko.pureComputed(function () { - - if (self.input_type() == "regular_gpio") { - if (self.label() != "") { - return true; - } - } - - return false - - }); - - self.fromInputEnclosureData = function (data) { - - self.isNew(data === undefined); - - if (data === undefined) { - var arrRelaysLength = self.enclosureInputs().length; - var nextIndex = arrRelaysLength == 0 ? 1 : self.enclosureInputs()[arrRelaysLength - 1].index_id() + 1; - data = cleanInput(nextIndex); - } else { - objIndex = self.enclosureInputs().findIndex((obj => obj.index_id == data.index_id)); - data = ko.mapping.toJS(self.enclosureInputs()[objIndex]); - } - - // general info - self.index_id(data.index_id); - self.label(data.label); - self.input_type(data.input_type); - self.action_type(data.action_type); - // gpio output - self.gpio_pin(data.gpio.pin_name); - self.pull_resistor(data.gpio.pull_resistor); - self.linked_action(data.gpio.linked_action); - self.edge_detection(data.gpio.edge_detection); - // output on linked action - self.controlled_output(data.linked_output_action.output_index_id); - self.controlled_output_set_value(data.linked_output_action.output_set_value); - // printer action on linked action - self.printer_action(data.linked_printer_action.action); - self.filament_sensor_enabled(data.linked_printer_action.filament_sensor_enabled); - self.filament_sensor_timeout(data.linked_printer_action.filament_sensor_timeout); - // temperature sensor - self.temperature_sensor_type(data.type); - self.temperature_sensor_address(data.address); - self.temperature_sensor_unit(data.unit); - - }; - - self.toInputEnclosureData = function (data) { - var output_data = { - index_id: self.index_id(), - label: self.label(), - input_type: self.input_type(), - action_type: self.action_type(), - gpio: { - pin_name: self.gpio_pin(), - pull_resistor: self.pull_resistor(), - linked_action: self.linked_action(), - edge_detection: self.edge_detection(), - }, - linked_printer_action: { - action: self.printer_action(), - filament_sensor_enabled: self.filament_sensor_enabled(), - filament_sensor_timeout: self.filament_sensor_timeout(), - }, - linked_output_action: { - output_index_id: self.controlled_output(), - output_set_value: self.controlled_output_set_value(), - }, - temperature_sensor: { - type: self.temperature_sensor_type(), - address: self.temperature_sensor_address(), - unit: self.temperature_sensor_unit(), - } - } - - return output_data; - }; - - - // end of EnclosureInputEditorViewModel - }; - - function EnclosureOutputEditorViewModel(parameters) { - var self = this; - - self.isNew = ko.observable(false); - // general info - self.index_id = ko.observable(); - self.label = ko.observable(); - self.output_type = ko.observable(); - // gpio output - self.gpio_pin = ko.observable(); - self.active_low = ko.observable(); - // gcode output - self.gcode = ko.observable(); - // neopixel output - self.neopixel_count = ko.observable(); - self.neopixel_brightness = ko.observable(); - self.default_neopixel_color = ko.observable(); - // other output configurations - self.hide_btn_ui = ko.observable(); - self.show_on_navbar = ko.observable(); - // pwm output - self.pwm_temperature_linked = ko.observable(); - self.duty_a = ko.observable(); - self.temperature_a = ko.observable(); - self.duty_b = ko.observable(); - self.temperature_b = ko.observable(); - self.pwm_frequency = ko.observable(); - self.default_duty_cycle = ko.observable(); - self.pwm_linked_temp_sensor = ko.observable(); - // led strip output - self.led_trip_gpio_clk = ko.observable(); - self.led_strip_gpio_data = ko.observable(); - self.default_led_strip_color = ko.observable(); - // schedule config - self.toggle_timer = ko.observable(); - self.toggle_time_on = ko.observable(); - self.toggle_time_off = ko.observable(); - self.startup_with_server = ko.observable(); - self.auto_startup = ko.observable(); - self.startup_time_delay = ko.observable(); - self.auto_shutdown = ko.observable(); - self.shutdown_on_failed = ko.observable(); - self.shutdown_time_delay = ko.observable(); - // shell script output - self.shell_script = ko.observable(); - // temp alarm output - self.alarm_linked_temp_sensor = ko.observable(); - self.alarm_set_temp = ko.observable(); - self.controlled_io = ko.observable(); - self.controlled_io_set_value = ko.observable(); - // temp control output - self.temp_ctr_linked_sensor = ko.observable(); - self.temp_ctr_type = ko.observable(); - self.temp_ctr_default_value = ko.observable(); - self.temp_ctr_deadband = ko.observable(); - self.temp_ctr_max_temp = ko.observable(); - - self.enclosureOutputs = undefined; - - self.validOutput = ko.pureComputed(function () { - - if (self.output_type() == "regular_gpio") { - if (self.label() != "" && self.gpio_pin() != "" && isInteger(self.gpio_pin())) { - return true; - } - } - return false; - }); - - self.fromOutputEnclosureData = function (data) { - - self.isNew(data === undefined); - - if (data === undefined) { - var arrRelaysLength = self.enclosureOutputs().length; - var nextIndex = arrRelaysLength == 0 ? 1 : self.enclosureOutputs()[arrRelaysLength - 1].index_id() + 1; - data = cleanOutput(nextIndex); - } else { - objIndex = self.enclosureOutputs().findIndex((obj => obj.index_id == data.index_id)); - data = ko.mapping.toJS(self.enclosureOutputs()[objIndex]); - } - - // general info - self.index_id(data.index_id); - self.label(data.label); - self.output_type(data.output_type); - // gpio output - self.gpio_pin(data.gpio.pin_name); - self.active_low(data.gpio.active_low); - // gcode output - self.gcode(data.gcode.gcode); - // neopixel output - self.neopixel_count(data.neopixel.count); - self.neopixel_brightness(data.neopixel.brightness); - self.default_neopixel_color(data.neopixel.default_color); - // other output configurations - self.hide_btn_ui(data.other_config.hide_on_tab); - self.show_on_navbar(data.other_config.show_on_navbar); - // pwm output - self.pwm_temperature_linked(data.pwm.linked_to_temperature); - self.duty_a(data.pwm.duty_a); - self.temperature_a(data.pwm.temperature_a); - self.duty_b(data.pwm.duty_b); - self.temperature_b(data.pwm.temperature_b); - self.pwm_frequency(data.pwm.frequency); - self.default_duty_cycle(data.pwm.default_duty_cycle); - self.pwm_linked_temp_sensor(data.pwm.linked_temp_sensor); - // led strip output - self.led_trip_gpio_clk(data.led_strip.clock_pin); - self.led_strip_gpio_data(data.led_strip.data_pin); - self.default_led_strip_color(data.led_strip.default_color); - // schedule config - self.toggle_timer(data.schedule.toggle_timer); - self.toggle_time_on(data.schedule.time_on); - self.toggle_time_off(data.schedule.time_off); - self.startup_with_server(data.schedule.startup_with_server); - self.auto_startup(data.schedule.auto_startup); - self.startup_time_delay(data.schedule.startup_time_delay); - self.auto_shutdown(data.schedule.auto_shutdown); - self.shutdown_on_failed(data.schedule.shutdown_on_failed); - self.shutdown_time_delay(data.schedule.shutdown_time_delay); - // shell script output - self.shell_script(data.shell_script.shell_script); - // temp alarm output - self.alarm_linked_temp_sensor(data.temperature_alarm.linked_temp_sensor); - self.alarm_set_temp(data.temperature_alarm.set_temp); - self.controlled_io(data.temperature_alarm.controlled_io); - self.controlled_io_set_value(data.temperature_alarm.controlled_io_set_value); - // temp control output - self.temp_ctr_linked_sensor(data.temperature_control.linked_temp_sensor); - self.temp_ctr_type(data.temperature_control.control_type); - self.temp_ctr_default_value(data.temperature_control.default_value); - self.temp_ctr_deadband(data.temperature_control.deadband); - self.temp_ctr_max_temp(data.temperature_control.max_temperature); - }; - - self.showColorPicker = function () { - - }; - - self.toOutputEnclosureData = function () { - var output_data = { - index_id: self.index_id(), - label: self.label(), - output_type: self.output_type(), - gpio: { - pin_name: self.gpio_pin(), - active_low: self.active_low(), - }, - gcode: { - gcode: self.gcode(), - }, - neopixel: { - count: self.neopixel_count(), - brightness: self.neopixel_brightness(), - default_color: self.default_neopixel_color(), - }, - other_config: { - hide_on_tab: self.hide_btn_ui(), - show_on_navbar: self.show_on_navbar(), - }, - pwm: { - linked_to_temperature: self.pwm_temperature_linked(), - duty_a: self.duty_a(), - temperature_a: self.temperature_a(), - duty_b: self.duty_b(), - temperature_b: self.temperature_b(), - frequency: self.pwm_frequency(), - default_duty_cycle: self.default_duty_cycle(), - linked_temp_sensor: self.pwm_linked_temp_sensor(), - }, - led_strip: { - clock_pin: self.led_trip_gpio_clk(), - data_pin: self.led_strip_gpio_data(), - default_color: self.default_led_strip_color(), - }, - schedule: { - toggle_timer: self.toggle_timer(), - time_on: self.toggle_time_on(), - time_off: self.toggle_time_off(), - startup_with_server: self.startup_with_server(), - auto_startup: self.auto_startup(), - startup_time_delay: self.startup_time_delay(), - auto_shutdown: self.auto_shutdown(), - shutdown_on_failed: self.shutdown_on_failed(), - shutdown_time_delay: self.shutdown_time_delay(), - }, - shell_script: { - shell_script: self.shell_script(), - }, - temperature_alarm: { - linked_temp_sensor: self.alarm_linked_temp_sensor(), - set_temp: self.alarm_set_temp(), - controlled_io: self.controlled_io(), - controlled_io_set_value: self.controlled_io_set_value(), - }, - temperature_control: { - linked_temp_sensor: self.temp_ctr_linked_sensor(), - control_type: self.temp_ctr_type(), - default_value: self.temp_ctr_default_value(), - deadband: self.temp_ctr_deadband(), - max_temperature: self.temp_ctr_max_temp(), - } - } - return output_data - }; - - // end of EnclosureOutputEditorViewModel - }; - function EnclosureViewModel(parameters) { var self = this; @@ -434,172 +13,28 @@ $(function () { self.settings_unsaved = ko.observable(false); self.onBeforeBinding = function () { - self.enclosureOutputs(self.settingsViewModel.settings.plugins.enclosure.enclosureOutputs()) - self.enclosureInputs(self.settingsViewModel.settings.plugins.enclosure.enclosureInputs()) - // self.settings_unsaved(false); + }; self.onSettingsBeforeSave = function () { - // self.enclosureOutputs(self.settingsViewModel.settings.plugins.enclosure.enclosureOutputs()); }; self.onEventSettingsUpdated = function () { - self.settingsViewModel.settings.plugins.enclosure.enclosureOutputs(self.enclosureOutputs()); - self.settingsViewModel.settings.plugins.enclosure.enclosureInputs(self.enclosureInputs()); - self.settings_unsaved(false); + }; - self.syncSettings = function () { - // self.settingsViewModel.settings.plugins.enclosure.enclosureOutputs(self.enclosureOutputs()); - // self.settingsViewModel.settings.plugins.enclosure.enclosureInputs(self.enclosureInputs()); - // self.settings_unsaved(false); - }; - - self.createOutputEditor = function (data) { - var outputEditor = new EnclosureOutputEditorViewModel(); - return outputEditor; - }; - - self.createInputEditor = function (data) { - var inputEditor = new EnclosureInputEditorViewModel(); - return inputEditor; - }; - - self.outputEditor = self.createOutputEditor(); - self.outputEditor.enclosureOutputs = self.enclosureOutputs; - - self.inputEditor = self.createInputEditor(); - self.inputEditor.enclosureInputs = self.enclosureInputs; - - - self.removeOutput = function (data) { - self.enclosureOutputs.remove(data); - self.settings_unsaved(true); - }; - - self.removeInput = function(data){ - self.enclosureInputs.remove(data); - self.settings_unsaved(true); - } - - self.showOutputEditorDialog = function (data) { - - self.outputEditor.fromOutputEnclosureData(data); - - var editDialog = $("#settings_outputs_edit_dialog"); - - $('ul.nav-pills a[data-toggle="tab"]:first', editDialog).tab("show"); - editDialog.modal({ - minHeight: function () { - return Math.max($.fn.modal.defaults.maxHeight() - 80, 250); - } - }).css({ - width: 'auto', - 'margin-left': function () { - return -($(this).width()); - } - }); - }; - - self.showInputEditorDialog = function (data) { - - self.inputEditor.fromInputEnclosureData(data); - - var editDialog = $("#settings_inputs_edit_dialog"); - - $('ul.nav-pills a[data-toggle="tab"]:first', editDialog).tab("show"); - editDialog.modal({ - minHeight: function () { - return Math.max($.fn.modal.defaults.maxHeight() - 80, 250); - } - }).css({ - width: 'auto', - 'margin-left': function () { - return -($(this).width()); - } - }); - }; - - self.confirmEditOutput = function () { - - if (self.outputEditor.validOutput()) { - var callback = function () { - $("#settings_outputs_edit_dialog").modal("hide"); - }; - - self.addOutputs(callback); - - // self.syncSettings(); - } - }; - - self.confirmEditInput = function () { - - if (self.inputEditor.validInput()) { - var callback = function () { - $("#settings_inputs_edit_dialog").modal("hide"); - }; - - self.addInputs(callback); - - // self.syncSettings(); - } - }; - - - self.addOutputs = function (callback) { - var isNew = self.outputEditor.isNew(); - - self.settings_unsaved(true); - - var output = ko.mapping.fromJS(self.outputEditor.toOutputEnclosureData()); - - if (isNew) { - self.enclosureOutputs.push(output); - } else { - objIndex = self.enclosureOutputs().findIndex((obj => obj.index_id() == output.index_id())); - var _old_output = self.enclosureOutputs()[objIndex]; - self.enclosureOutputs.replace(_old_output, output); - } - - if (callback !== undefined) { - callback(); - } - }; - - self.addInputs = function (callback) { - var isNew = self.inputEditor.isNew(); - - self.settings_unsaved(true); - - var input = ko.mapping.fromJS(self.inputEditor.toInputEnclosureData()); - - if (isNew) { - self.enclosureInputs.push(input); - } else { - objIndex = self.enclosureInputs().findIndex((obj => obj.index_id() == input.index_id())); - var _old_input = self.enclosureInputs()[objIndex]; - self.enclosureInputs.replace(_old_input, input); - } - - if (callback !== undefined) { - callback(); - } - }; - + self.print_data = function () { - console.log(self); + }; - // end of EnclosureViewModel }; OCTOPRINT_VIEWMODELS.push({ construct: EnclosureViewModel, - // ViewModels your plugin depends on, e.g. loginStateViewModel, settingsViewModel, ... dependencies: ["settingsViewModel", "connectionViewModel", "printerStateViewModel"], elements: ["#settings_plugin_enclosure"] });