Initial repository

This commit is contained in:
Elizabeth Cray 2024-04-05 21:22:02 -04:00
commit 73a53f1b12
133 changed files with 1016061 additions and 0 deletions

3
.gitmodules vendored Normal file
View File

@ -0,0 +1,3 @@
[submodule "dirs/klipper"]
path = dirs/klipper
url = https://github.com/Klipper3d/klipper

202
LICENSE Normal file
View File

@ -0,0 +1,202 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

13
README.md Normal file
View File

@ -0,0 +1,13 @@
# HacDC Klipper Config Tool and Templates
Huge WIP FYI
## TODO
* Install prerequisites
* Select Klipper config and copy to ./dirs/klipper
* Compile Klipper in ./dirs/klipper
* Install Klipper onto USB device (TUI picker, save device path for later)
* Edit config files accordingly
* Recursive Copy dirs into `~/<printername>/`
* Install System services

1
dirs/klipper Submodule

@ -0,0 +1 @@
Subproject commit 6ce6fbbce07605010c0d4fa8eaa0ebcde01e53db

1
dirs/mainsail-config Submodule

@ -0,0 +1 @@
Subproject commit e57810d51b5c634aadaca4db923bfcba269ae4b3

1
dirs/mainsail/.version Normal file
View File

@ -0,0 +1 @@
v2.9.1

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.rename-profile[data-v-37c48ba8]{text-transform:none}.currentMeshName[data-v-37c48ba8]{cursor:pointer;color:var(--v-primary-base)}.currentMeshName .v-icon[data-v-37c48ba8]{opacity:0}.currentMeshName:hover .v-icon[data-v-37c48ba8]{opacity:1}.rowProfile .colActions[data-v-37c48ba8]{display:flex;flex-direction:row;align-items:center;justify-content:flex-end}.rowProfile .colName[data-v-37c48ba8],.rowProfile .colVariance[data-v-37c48ba8]{line-height:48px}.rowProfile .colName span.current[data-v-37c48ba8]{font-weight:700;color:var(--v-primary-base)}.rowProfile .colActions .v-btn[data-v-37c48ba8]{height:48px;width:48px}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.webcamImage[data-v-16b345da]{width:100%}

View File

@ -0,0 +1 @@
import{m as p,B as _,G as u,P as m,j as v,n as f}from"./index-97b4652c.js";import"./vuetify-52f40ce5.js";import"./overlayscrollbars-44d87bcf.js";import"./echarts-9bc570b0.js";var b=Object.defineProperty,h=Object.getOwnPropertyDescriptor,o=(t,e,r,s)=>{for(var i=s>1?void 0:s?h(e,r):e,n=t.length-1,l;n>=0;n--)(l=t[n])&&(i=(s?l(e,r,i):l(i))||i);return s&&i&&b(e,r,i),i};let a=class extends p(_,u){constructor(){super(...arguments),this.isVisible=!0}get url(){var e;return this.convertUrl((e=this.camSettings)==null?void 0:e.stream_url,this.printerUrl)}get webcamStyle(){var e,r,s;return{transform:this.generateTransform((e=this.camSettings.flip_horizontal)!=null?e:!1,(r=this.camSettings.flip_vertical)!=null?r:!1,(s=this.camSettings.rotation)!=null?s:0)}}visibilityChanged(e){this.isVisible=e}};o([m({required:!0})],a.prototype,"camSettings",2);o([m({default:null})],a.prototype,"printerUrl",2);a=o([v],a);var g=function(){var t=this,e=t.$createElement,r=t._self._c||e;return r("video",{directives:[{name:"observe-visibility",rawName:"v-observe-visibility",value:t.visibilityChanged,expression:"visibilityChanged"}],staticClass:"webcamImage",style:t.webcamStyle,attrs:{src:t.url,autoplay:""}})},y=[];const c={};var d=f(a,g,y,!1,x,"bd59f4b0",null,null);function x(t){for(let e in c)this[e]=c[e]}const j=function(){return d.exports}();export{j as default};

View File

@ -0,0 +1 @@
.webcamImage[data-v-bd59f4b0]{width:100%}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.webcamImage[data-v-03ec43aa]{width:100%}._webcam_jmuxer_output[data-v-03ec43aa]{aspect-ratio:1.5}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.webcamStream[data-v-5fed87a3]{width:100%}._webcam_webrtc_output[data-v-5fed87a3]{aspect-ratio:1.5}video[data-v-5fed87a3]{width:100%}

View File

@ -0,0 +1 @@
import{m as y,B as w,G as C,P as d,W as R,j as P,n as x}from"./index-97b4652c.js";import"./vuetify-52f40ce5.js";import"./overlayscrollbars-44d87bcf.js";import"./echarts-9bc570b0.js";var F=Object.defineProperty,V=Object.getOwnPropertyDescriptor,m=(s,t,e,a)=>{for(var i=a>1?void 0:a?V(t,e):t,r=s.length-1,n;r>=0;r--)(n=s[r])&&(i=(a?n(t,e,i):n(i))||i);return a&&i&&F(t,e,i),i};const j="content-length",L="image/jpeg";let h=class extends y(w,C){constructor(){super(...arguments),this.currentFPS=0,this.streamState=!1,this.aspectRatio=null,this.timerFPS=null,this.timerRestart=null,this.stream=null,this.controller=null,this.isVisibleViewport=!1,this.isVisibleDocument=!0}get url(){var t;return this.convertUrl((t=this.camSettings)==null?void 0:t.stream_url,this.printerUrl)}get webcamStyle(){var e,a,i;const t={transform:this.generateTransform((e=this.camSettings.flip_horizontal)!=null?e:!1,(a=this.camSettings.flip_vertical)!=null?a:!1,(i=this.camSettings.rotation)!=null?i:0),aspectRatio:1.7777777777777777,maxHeight:window.innerHeight-155+"px",maxWidth:"auto"};return this.aspectRatio&&(t.aspectRatio=this.aspectRatio,t.maxWidth=(window.innerHeight-155)*this.aspectRatio+"px"),t}get fpsOutput(){return this.currentFPS<10?"0"+this.currentFPS.toString():this.currentFPS}get showFpsCounter(){var t,e;return this.showFps?!((e=(t=this.camSettings.extra_data)==null?void 0:t.hideFps)!=null&&e):!1}startStream(){if(this.streamState)return;this.streamState=!0;const t=new Uint8Array(2);t[0]=255,t[1]=216;function e(i){let r=-1;return i.split("\n").forEach(n=>{const o=n.split(":");o[0].toLowerCase()===j&&(r=o[1])}),r}this.controller=new AbortController;const{signal:a}=this.controller;fetch(this.url,{signal:a,mode:"cors"}).then(i=>i.body).then(i=>{const r=i==null?void 0:i.getReader();let n="",o=-1,p=null,f=0;const u=this.$refs.image;let g=0;this.timerFPS=setInterval(()=>{this.currentFPS=g,g=0},1e3),this.timerRestart=setInterval(()=>{this.restartStream()},6e4),this.stream=new ReadableStream({start(S){const b=()=>r==null?void 0:r.read().then(({done:_,value:l})=>{if(_){S.close();return}if(S.enqueue(l),l)for(let c=0;c<l.length;c++)l[c]===t[0]&&l[c+1]===t[1]&&(o=e(n),p=new Uint8Array(new ArrayBuffer(o))),o<=0?n+=String.fromCharCode(l[c]):f<o?p[f++]=l[c]:(u&&(u.src=URL.createObjectURL(new Blob([p],{type:L})),u.onload=()=>URL.revokeObjectURL(u.src)),g++,o=0,f=0,n="");return b()});return b()}})})}mounted(){document.addEventListener("visibilitychange",this.documentVisibilityChanged),this.startStream()}beforeDestroy(){document.removeEventListener("visibilitychange",this.documentVisibilityChanged),this.stopStream()}stopStream(){var t,e;this.streamState=!1,URL.revokeObjectURL(this.url),this.timerFPS&&clearTimeout(this.timerFPS),this.timerRestart&&clearTimeout(this.timerRestart),(t=this.controller)==null||t.abort(),(e=this.stream)==null||e.cancel()}async restartStream(){this.stopStream(),this.startStream()}camSettingsChanged(){this.aspectRatio=null,this.restartStream()}documentVisibilityChanged(){const t=document.visibilityState;this.isVisibleDocument=t==="visible",this.isVisibleDocument||this.stopStream(),this.visibilityChanged()}viewportVisibilityChanged(t){this.isVisibleViewport=t,this.visibilityChanged()}visibilityChanged(){if(this.isVisibleViewport&&this.isVisibleDocument){this.startStream();return}this.stopStream()}onload(){this.aspectRatio!==null||!this.$refs.image||(this.aspectRatio=this.$refs.image.naturalWidth/this.$refs.image.naturalHeight)}};m([d({required:!0})],h.prototype,"camSettings",2);m([d({default:null})],h.prototype,"printerUrl",2);m([d({default:!0})],h.prototype,"showFps",2);m([R("camSettings",{immediate:!0,deep:!0})],h.prototype,"camSettingsChanged",1);h=m([P],h);var O=function(){var s=this,t=s.$createElement,e=s._self._c||t;return e("div",{staticClass:"d-flex justify-center",staticStyle:{position:"relative"}},[e("img",{directives:[{name:"observe-visibility",rawName:"v-observe-visibility",value:s.viewportVisibilityChanged,expression:"viewportVisibilityChanged"}],ref:"image",staticClass:"webcamImage",style:s.webcamStyle,on:{load:s.onload}}),s.showFpsCounter?e("span",{staticClass:"webcamFpsOutput"},[s._v(s._s(s.$t("Panels.WebcamPanel.FPS"))+": "+s._s(s.fpsOutput))]):s._e()])},U=[];const v={};var E=x(h,O,U,!1,D,"d03b4202",null,null);function D(s){for(let t in v)this[t]=v[t]}const H=function(){return E.exports}();export{H as default};

View File

@ -0,0 +1 @@
.webcamImage[data-v-d03b4202]{width:100%;background:lightgray}.webcamFpsOutput[data-v-d03b4202]{display:inline-block;position:absolute;bottom:0;right:0;background:rgba(0,0,0,.8);padding:3px 10px;border-top-left-radius:5px}

View File

@ -0,0 +1 @@
import{m as u,B as p,G as d,P as m,j as _,n as g}from"./index-97b4652c.js";import{p as f}from"./vuetify-52f40ce5.js";import"./overlayscrollbars-44d87bcf.js";import"./echarts-9bc570b0.js";var v=Object.defineProperty,w=Object.getOwnPropertyDescriptor,h=(r,t,e,i)=>{for(var s=i>1?void 0:i?w(t,e):t,a=r.length-1,n;a>=0;a--)(n=r[a])&&(s=(i?n(t,e,s):n(s))||s);return i&&s&&v(t,e,s),s};let o=class extends u(p,d){constructor(){super(...arguments),this.refresh=Math.ceil(Math.random()*Math.pow(10,12)),this.isVisible=!0,this.isVisibleDocument=!0,this.isVisibleViewport=!1,this.isLoaded=!0,this.timer=void 0,this.request_start_time=performance.now(),this.start_time=performance.now(),this.time=0,this.request_time=0,this.time_smoothing=.6,this.request_time_smoothing=.1,this.currentFPS=0,this.aspectRatio=null}get webcamStyle(){var e,i,s;const t={transform:this.generateTransform((e=this.camSettings.flip_horizontal)!=null?e:!1,(i=this.camSettings.flip_vertical)!=null?i:!1,(s=this.camSettings.rotation)!=null?s:0),aspectRatio:1.7777777777777777,maxHeight:window.innerHeight-155+"px",maxWidth:"auto"};return this.aspectRatio&&(t.aspectRatio=this.aspectRatio,t.maxWidth=(window.innerHeight-155)*this.aspectRatio+"px"),t}get fpsOutput(){return this.currentFPS<10?"0"+this.currentFPS.toString():this.currentFPS}get showFpsCounter(){var t,e;return this.showFps?!((e=(t=this.camSettings.extra_data)==null?void 0:t.hideFps)!=null&&e):!1}get rotate(){var t;return[90,270].includes((t=this.camSettings.rotation)!=null?t:0)}get url(){var t;return this.convertUrl((t=this.camSettings)==null?void 0:t.snapshot_url,this.printerUrl)}refreshFrame(){this.isVisible&&(this.refresh=new Date().getTime(),this.setFrame())}async setFrame(){let t=new URL(this.url);t.searchParams.append("bypassCache",this.refresh.toString()),this.request_start_time=performance.now(),this.currentFPS=this.time>0?Math.round(1e3/this.time):0;let e=this.$refs.image;if(e){const i=e.getContext("2d"),s=await this.loadImage(t.toString());if(this.aspectRatio=s.naturalWidth/s.naturalHeight,this.rotate&&(this.aspectRatio=1/this.aspectRatio),e.width=e.clientWidth,e.height=e.clientWidth/this.aspectRatio,this.rotate){const a=e.height/s.width,n=e.width/2,c=e.height/2;i.translate(n,c),i.rotate(this.camSettings.rotation*Math.PI/180),await(i==null?void 0:i.drawImage(s,-s.width/2*a,-s.height/2*a,s.width*a,s.height*a)),i.rotate(-(this.camSettings.rotation*Math.PI/180)),i.translate(-n,-c)}else await(i==null?void 0:i.drawImage(s,0,0,s.width,s.height,0,0,e.width,e.height));this.isLoaded=!0}this.$nextTick(()=>{this.onLoad()})}onLoad(){this.isLoaded=!0;const t=this.camSettings.target_fps||10,e=performance.now(),i=e-this.start_time;this.time=this.time*this.time_smoothing+i*(1-this.time_smoothing),this.start_time=e;const s=1e3/t,a=performance.now()-this.request_start_time;this.request_time=this.request_time*this.request_time_smoothing+a*(1-this.request_time_smoothing);const n=Math.max(0,s-this.request_time);this.$nextTick(()=>{this.timer=setTimeout(this.refreshFrame,n)})}loadImage(t){return new Promise(e=>{let i=new Image;i.onload=()=>e(i),i.onerror=()=>setTimeout(this.refreshFrame,1e3),i.src=t})}mounted(){document.addEventListener("visibilitychange",this.documentVisibilityChanged),this.refreshFrame()}beforeDestroy(){document.removeEventListener("visibilitychange",this.documentVisibilityChanged)}documentVisibilityChanged(){const t=document.visibilityState;this.isVisibleDocument=t==="visible",this.isVisibleDocument||this.stopStream(),this.visibilityChanged()}viewportVisibilityChanged(t){this.isVisibleViewport=t,this.visibilityChanged()}visibilityChanged(){if(this.isVisibleViewport&&this.isVisibleDocument){this.startStream();return}this.stopStream()}startStream(){this.isVisible||(this.isVisible=!0,this.refreshFrame())}stopStream(){this.isVisible=!1,clearTimeout(this.timer),this.timer=void 0}};h([m({required:!0})],o.prototype,"camSettings",2);h([m({default:null})],o.prototype,"printerUrl",2);h([m({default:!0})],o.prototype,"showFps",2);o=h([_],o);var b=function(){var r=this,t=r.$createElement,e=r._self._c||t;return e("div",{staticClass:"d-flex justify-center",staticStyle:{position:"relative"}},[r.isLoaded?r._e():e("div",{staticClass:"text-center py-5"},[e(f,{attrs:{indeterminate:"",color:"primary"}})],1),e("canvas",{directives:[{name:"observe-visibility",rawName:"v-observe-visibility",value:r.viewportVisibilityChanged,expression:"viewportVisibilityChanged"}],ref:"image",class:"webcamImage "+(r.isLoaded?"":"hiddenWebcam"),style:r.webcamStyle,attrs:{width:"600",height:"400"}}),r.isLoaded&&r.showFpsCounter?e("span",{staticClass:"webcamFpsOutput"},[r._v(" "+r._s(r.$t("Panels.WebcamPanel.FPS"))+": "+r._s(r.fpsOutput)+" ")]):r._e()])},y=[];const l={};var S=g(o,b,y,!1,F,"72cc9e9c",null,null);function F(r){for(let t in l)this[t]=l[t]}const q=function(){return S.exports}();export{q as default};

View File

@ -0,0 +1 @@
.webcamImage[data-v-72cc9e9c]{width:100%}.webcamFpsOutput[data-v-72cc9e9c]{display:inline-block;position:absolute;bottom:0;right:0;background:rgba(0,0,0,.8);padding:3px 10px;border-top-left-radius:5px}

View File

@ -0,0 +1 @@
.webcamImage[data-v-3177fd01]{width:100%;background:lightgray}

View File

@ -0,0 +1 @@
import{m as h,B as p,G as u,P as m,W as v,j as g,n as b}from"./index-97b4652c.js";import"./vuetify-52f40ce5.js";import"./overlayscrollbars-44d87bcf.js";import"./echarts-9bc570b0.js";var f=Object.defineProperty,d=Object.getOwnPropertyDescriptor,n=(e,t,s,a)=>{for(var i=a>1?void 0:a?d(t,s):t,l=e.length-1,o;l>=0;l--)(o=e[l])&&(i=(a?o(t,s,i):o(i))||i);return a&&i&&f(t,s,i),i};let r=class extends h(p,u){constructor(){super(...arguments),this.aspectRatio=null,this.isVisible=!1,this.isVisibleViewport=!1,this.isVisibleDocument=!0}get url(){var t;return this.convertUrl((t=this.camSettings)==null?void 0:t.stream_url,this.printerUrl)}get webcamStyle(){var s,a,i;const t={transform:this.generateTransform((s=this.camSettings.flip_horizontal)!=null?s:!1,(a=this.camSettings.flip_vertical)!=null?a:!1,(i=this.camSettings.rotation)!=null?i:0),aspectRatio:1.7777777777777777,maxHeight:window.innerHeight-155+"px",maxWidth:"auto"};return this.aspectRatio&&(t.aspectRatio=this.aspectRatio,t.maxWidth=(window.innerHeight-155)*this.aspectRatio+"px"),t}mounted(){document.addEventListener("visibilitychange",this.documentVisibilityChanged)}beforeDestroy(){document.removeEventListener("visibilitychange",this.documentVisibilityChanged),this.stopStream()}startStream(){this.isVisible||this.$refs.webcamUv4lMjpegImage&&this.$refs.webcamUv4lMjpegImage.setAttribute("src",this.url)}stopStream(){this.$refs.webcamUv4lMjpegImage&&(this.$refs.webcamUv4lMjpegImage.removeAttribute("src"),URL.revokeObjectURL(this.url))}documentVisibilityChanged(){const t=document.visibilityState;this.isVisibleDocument=t==="visible",this.isVisibleDocument||this.stopStream(),this.visibilityChanged()}viewportVisibilityChanged(t){this.isVisibleViewport=t,this.visibilityChanged()}visibilityChanged(){if(this.isVisibleViewport&&this.isVisibleDocument){this.startStream();return}this.stopStream()}onload(){this.aspectRatio===null&&this.$refs.webcamUv4lMjpegImage&&(this.aspectRatio=this.$refs.webcamUv4lMjpegImage.naturalWidth/this.$refs.webcamUv4lMjpegImage.naturalHeight)}async urlChanged(){await this.stopStream(),await this.startStream()}};n([m({required:!0})],r.prototype,"camSettings",2);n([m({default:null})],r.prototype,"printerUrl",2);n([v("url")],r.prototype,"urlChanged",1);r=n([g],r);var _=function(){var e=this,t=e.$createElement,s=e._self._c||t;return s("div",{staticClass:"d-flex justify-center"},[s("img",{directives:[{name:"observe-visibility",rawName:"v-observe-visibility",value:e.viewportVisibilityChanged,expression:"viewportVisibilityChanged"}],ref:"webcamUv4lMjpegImage",staticClass:"webcamImage",style:e.webcamStyle,on:{load:e.onload}})])},y=[];const c={};var w=b(r,_,y,!1,j,"3177fd01",null,null);function j(e){for(let t in c)this[t]=c[t]}const M=function(){return w.exports}();export{M as default};

View File

@ -0,0 +1 @@
[data-v-7831183a] .cm-activeLine{background-color:#333!important}.codeview[data-v-7831183a]{height:100%;overflow:auto}.viewer{width:100%;height:calc(var(--app-height) - 240px);border:1px solid #3f3f3f}.withScrubber .viewer{height:calc(var(--app-height) - 300px)}@media (min-width: 600px) and (max-width: 959px){.viewer{height:calc(var(--app-height) - 295px)}.withScrubber .viewer{height:calc(var(--app-height) - 360px)}}@media (max-width: 599px){.viewer,.withScrubber .viewer{height:calc(var(--app-height) - 340px)}}.scrubber[data-v-0de79293]{position:relative;left:0;right:0;bottom:5px}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{m as u,B as h,G as d,P as p,W as _,R as f,j as v,n as S}from"./index-97b4652c.js";import{l as y,m as g,p as w}from"./vuetify-52f40ce5.js";import"./overlayscrollbars-44d87bcf.js";import"./echarts-9bc570b0.js";var T=Object.defineProperty,b=Object.getOwnPropertyDescriptor,c=(r,e,i,t)=>{for(var s=t>1?void 0:t?b(e,i):e,o=r.length-1,n;o>=0;o--)(n=r[o])&&(s=(t?n(e,i,s):n(s))||s);return t&&s&&T(e,i,s),s};let a=class extends u(h,d){constructor(){super(...arguments),this.pc=null,this.useStun=!1,this.remote_pc_id=null,this.aspectRatio=null,this.status="connecting",this.restartTimer=null}get url(){var e;return this.convertUrl((e=this.camSettings)==null?void 0:e.stream_url,this.printerUrl)}get webcamStyle(){var i,t,s;const e={transform:this.generateTransform((i=this.camSettings.flip_horizontal)!=null?i:!1,(t=this.camSettings.flip_vertical)!=null?t:!1,(s=this.camSettings.rotation)!=null?s:0),aspectRatio:1.7777777777777777};return this.aspectRatio&&(e.aspectRatio=this.aspectRatio),e}startStream(){const e=navigator.userAgent.toLowerCase().indexOf("firefox")>-1,i=this.useStun?[{urls:["stun:stun.l.google.com:19302"]}]:null;fetch(this.url,{body:JSON.stringify({type:"request",iceServers:i}),headers:{"Content-Type":"application/json"},method:"POST"}).then(t=>t.json()).then(t=>{var o;let s={sdpSemantics:"unified-plan"};return t.iceServers&&(s.iceServers=t.iceServers),this.pc=new RTCPeerConnection(s),this.pc.addTransceiver("video",{direction:"recvonly"}),this.pc.addEventListener("track",n=>{n.track.kind=="video"&&this.$refs.stream&&(this.$refs.stream.srcObject=n.streams[0])},!1),this.pc.addEventListener("connectionstatechange",()=>{var n,l;this.status=((l=(n=this.pc)==null?void 0:n.connectionState)!=null?l:"").toString(),this.restartTimer&&window.clearTimeout(this.restartTimer),["failed","disconnected"].includes(this.status)&&(this.restartTimer=window.setTimeout(()=>{this.restartStream()},5e3))}),this.pc.addEventListener("icecandidate",n=>{if(n.candidate)return fetch(this.url,{body:JSON.stringify({type:"remote_candidate",id:this.remote_pc_id,candidates:[n.candidate]}),headers:{"Content-Type":"application/json"},method:"POST"}).catch(function(l){window.console.error(l)})}),this.remote_pc_id=t.id,(o=this.pc)==null?void 0:o.setRemoteDescription(t)}).then(()=>{var t;return(t=this.pc)==null?void 0:t.createAnswer()}).then(t=>{var s;return(s=this.pc)==null?void 0:s.setLocalDescription(t)}).then(()=>{var s;const t=(s=this.pc)==null?void 0:s.localDescription;return fetch(this.url,{body:JSON.stringify({type:t==null?void 0:t.type,id:this.remote_pc_id,sdp:t==null?void 0:t.sdp}),headers:{"Content-Type":"application/json"},method:"POST"})}).then(t=>(e&&(this.status="connected"),t.json())).catch(t=>{window.console.error(t),this.restartTimer&&window.clearTimeout(this.restartTimer),this.restartTimer=window.setTimeout(()=>{this.restartStream()},5e3)})}mounted(){this.startStream()}beforeDestroy(){var e;(e=this.pc)==null||e.close(),this.restartTimer&&window.clearTimeout(this.restartTimer)}restartStream(){var e;(e=this.pc)==null||e.close(),setTimeout(async()=>{this.startStream()},500)}async changedUrl(){this.restartStream()}};c([p({required:!0})],a.prototype,"camSettings",2);c([p({default:null})],a.prototype,"printerUrl",2);c([f()],a.prototype,"stream",2);c([_("url")],a.prototype,"changedUrl",1);a=c([v],a);var C=function(){var r=this,e=r.$createElement,i=r._self._c||e;return i("div",[i("video",{directives:[{name:"show",rawName:"v-show",value:r.status==="connected",expression:"status === 'connected'"}],ref:"stream",staticClass:"webcamStream",style:r.webcamStyle,attrs:{autoplay:"",muted:"",playsinline:""},domProps:{muted:!0}}),r.status!=="connected"?i(y,[i(g,{staticClass:"_webcam_webrtc_output text-center d-flex flex-column justify-center align-center"},[r.status==="connecting"?i(w,{staticClass:"mb-3",attrs:{indeterminate:"",color:"primary"}}):r._e(),i("span",{staticClass:"mt-3"},[r._v(r._s(r.status))])],1)],1):r._e()],1)},x=[];const m={};var O=S(a,C,x,!1,j,"a89db62a",null,null);function j(r){for(let e in m)this[e]=m[e]}const U=function(){return O.exports}();export{U as default};

View File

@ -0,0 +1 @@
.webcamStream[data-v-a89db62a]{width:100%}._webcam_webrtc_output[data-v-a89db62a]{aspect-ratio:1.5}video[data-v-a89db62a]{width:100%}

View File

@ -0,0 +1 @@
.webcamImage[data-v-9a120824]{width:100%}._webcam_webrtc_output[data-v-9a120824]{aspect-ratio:1.5}video[data-v-9a120824]{width:100%}

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
.webcamImage[data-v-781d4888]{width:100%}._webcam_webrtc_output[data-v-781d4888]{aspect-ratio:1.5}video[data-v-781d4888]{width:100%}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1 @@
import{F as m}from"./index-97b4652c.js";import"./vuetify-52f40ce5.js";import"./overlayscrollbars-44d87bcf.js";import"./echarts-9bc570b0.js";function g(c={}){const{immediate:d=!1,onNeedRefresh:w,onOfflineReady:i,onRegistered:r,onRegisteredSW:a,onRegisterError:s}=c;let t,o;const l=async(n=!0)=>{await o};async function p(){if("serviceWorker"in navigator){const{Workbox:n}=await m(()=>import("./workbox-window.prod.es5-ed7f7eb3.js"),[]);t=new n("/sw.js",{scope:"/",type:"classic"}),t.addEventListener("activated",e=>{(e.isUpdate||e.isExternal)&&window.location.reload()}),t.addEventListener("installed",e=>{e.isUpdate||i==null||i()}),t.register({immediate:d}).then(e=>{a?a("/sw.js",e):r==null||r(e)}).catch(e=>{s==null||s(e)})}}return o=p(),l}export{g as registerSW};

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,8 @@
{
"defaultLocale": "en",
"defaultTheme": "dark",
"hostname": null,
"port": null,
"instancesDB": "moonraker-taz",
"instances": []
}

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 332 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 618 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@ -0,0 +1 @@
<svg height="599pt" preserveAspectRatio="xMidYMid meet" viewBox="0 0 599 599" width="599pt" xmlns="http://www.w3.org/2000/svg"><g transform="matrix(.1 0 0 -.1 0 599)"><path d="m3359 5488c-41-62-76-117-79-123-14-28-145-220-152-223-4-2-8-8-8-12 0-7-399-618-470-720-6-8-57-87-115-175-57-88-108-164-112-170-20-25-63-96-63-104 0-5-7-12-16-15-8-3-13-10-10-15 4-5 2-11-2-13-5-1-38-48-74-103-35-55-131-201-213-325-81-124-179-272-217-330-82-124-54-82-243-368-85-129-188-286-229-350-42-65-80-122-85-128-5-7-30-43-54-80-24-38-136-208-248-379-113-170-250-380-306-465s-105-159-110-165c-5-5-20-28-33-50s-27-42-30-45c-4-3-9-9-11-15-2-5-40-64-83-130-139-211-382-580-388-590-5-8 197-11 658-12h664l22 36c12 20 25 38 28 41s30 43 60 90c29 47 127 197 217 333s163 252 163 256c0 5 4 11 8 13 8 3 56 76 289 433 39 60 77 116 83 123 6 6 8 12 5 12s2 8 11 18c14 16 247 369 324 492 19 30 37 57 40 60 13 12 100 151 100 159 0 5 3 11 8 13 4 2 55 75 112 163 58 88 108 162 113 163 4 2 7 8 7 13s50 84 110 175c61 91 110 170 110 175s5 9 10 9c6 0 10 5 10 10 0 6 5 16 11 23s62 91 125 187c62 96 118 182 124 190s31 47 55 85c50 78 44 68 124 187 33 48 61 91 63 95 1 4 38 61 81 126l78 118-25 67c-84 219-216 665-261 882-2 8-8 35-14 60-15 69-22 102-27 135-2 16-7 39-11 50-3 11-8 31-10 45-10 67-14 88-22 128-5 23-11 45-13 48-3 2-38-46-79-108z"/><path d="m4020 3309c-58-88-112-170-120-183s-31-47-51-77-52-79-72-109-54-81-77-114c-22-32-40-60-40-62 0-8-45-69-52-72-5-2-8-9-8-16s-9-21-20-31-20-21-20-25-61-98-135-210-135-205-135-206c0-2-29-45-65-96s-65-98-65-104c0-7-7-15-16-18-9-4-14-9-11-12 3-4 1-11-4-18-6-6-55-78-110-161-54-82-103-157-109-165s-50-76-99-150c-50-74-95-140-100-147-6-7-16-24-23-38-6-14-15-25-20-25-4 0-8-4-8-9 0-6-90-145-200-310s-200-305-200-310-4-11-8-13c-8-3-162-234-162-243 0-3 299-5 665-5 625 0 666 1 672 17 4 10 84 135 178 278s211 322 260 398c50 76 96 145 103 152 6 8 12 16 12 19 0 6 294 456 309 473 6 7 11 14 11 17 0 8 63 100 73 107 5 3 8 8 6 10-1 2 38 65 87 139s91 140 94 145c3 6 49 77 103 158l98 148-20 32c-11 18-28 41-38 52s-66 92-124 180c-114 173-119 181-206 328-60 102-76 130-132 232-18 33-38 66-43 73-6 6-7 12-3 12 5 0 1 8-7 18-8 9-22 34-32 54-9 20-20 39-24 42-4 2-54-67-112-155z"/><path d="m5119 1822c-35-53-67-101-71-107-5-5-27-39-51-75-23-36-45-66-49-68-5-2-8-8-8-13 0-8-106-175-120-189s-160-241-160-249c0-5-4-11-9-13-5-1-27-32-50-68-22-36-44-70-48-75-5-6-64-96-133-200-69-105-128-191-132-193-5-2-8-10-8-18s-4-14-10-14c-5 0-10-4-10-10 0-5-20-39-45-76-25-36-45-67-45-69 0-3 299-5 665-5h665l12 25c6 14 14 25 18 25s12 11 18 25c7 14 17 31 22 38 17 19 210 317 210 322 0 3 5 11 11 18 21 24 179 269 179 278 0 5 5 9 10 9 22 0 7 18-67 80-193 162-512 474-690 673l-41 47z"/></g></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -0,0 +1 @@
<svg enable-background="new 0 0 599.38 523.11" viewBox="0 0 599.38 523.11" xmlns="http://www.w3.org/2000/svg"><g fill="#d41216"><path d="m382.29 142.98-249.31 379.84-132.98-.14 344.3-522.68c7.88 49.06 20.9 97.68 37.99 142.98"/><path d="m413.28 213.54-204.78 309.38 132.94.19 135.03-206.33c-23.78-32.49-44.94-67.01-63.19-103.24z"/><path d="m599.38 447.69-49.25 75.42-133.13-.29 101.6-153.67c24.88 28.2 51.89 54.46 80.78 78.54z"/></g></svg>

After

Width:  |  Height:  |  Size: 438 B

View File

@ -0,0 +1,206 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
enable-background="new 0 0 421.2 842.2"
version="1.1"
viewBox="0 0 421.2 842.2"
id="svg77"
sodipodi:docname="sidebar-background-light.svg"
inkscape:version="1.2.2 (732a01da63, 2022-12-09)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs81" />
<sodipodi:namedview
id="namedview79"
pagecolor="#ffffff"
bordercolor="#000000"
borderopacity="0.25"
inkscape:showpageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
inkscape:deskcolor="#d1d1d1"
showgrid="false"
inkscape:zoom="0.92139633"
inkscape:cx="20.078222"
inkscape:cy="421.10001"
inkscape:window-width="1920"
inkscape:window-height="974"
inkscape:window-x="-11"
inkscape:window-y="-11"
inkscape:window-maximized="1"
inkscape:current-layer="svg77" />
<linearGradient
id="a"
x1="-87.028"
x2="-86.028"
y1="841.97"
y2="841.97"
gradientTransform="matrix(-343.95 -596.42 -596.42 343.95 472648 -340719)"
gradientUnits="userSpaceOnUse">
<stop
stop-color="#080808"
offset="0"
id="stop2" />
<stop
stop-color="#242424"
offset="1"
id="stop4" />
</linearGradient>
<rect
x=".1"
y=".1"
width="421.1"
height="842.1"
fill="#e1e1e1"
stroke-linecap="round"
stroke-linejoin="round"
stroke-width="7.5591"
style="mix-blend-mode:luminosity;fill:#ffffff;fill-opacity:1"
id="rect7" />
<g
clip-rule="evenodd"
fill-rule="evenodd"
style="mix-blend-mode:exclusion"
id="g75">
<path
d="m0.1 0.1h420.9v841.9h-420.9z"
fill="url(#a)"
stroke="#000"
stroke-linecap="round"
stroke-linejoin="round"
stroke-miterlimit="3.1571"
stroke-width=".2736"
id="path9" />
<path
d="m147 152.1-146.9-152h130z"
fill="#242424"
id="path11" />
<path
d="m147 152.1-146.9-152v106.7z"
fill="#252525"
id="path13" />
<path
d="m147 152.1v62.7l-146.9-80.5v-27.5z"
fill="#222"
id="path15" />
<path
d="m0.1 268.5 146.9-53.7-146.9-80.5z"
fill="#242424"
id="path17" />
<path
d="m0.1 268.5 146.9-53.7-47.9 206.3z"
fill="#1f1f1f"
id="path19" />
<path
d="m0.1 268.5v201l8.4 2.1 90.5-50.5z"
fill="#1f1f1f"
id="path21" />
<path
d="m33.8 528.4-25.2-56.8 90.5-50.5z"
fill="#1a1a1a"
id="path23" />
<path
d="m33.8 528.4 204.2 19-138.9-126.3z"
fill="#181818"
id="path25" />
<path
d="m33.8 528.4 204.2 19-124.2 84.2z"
fill="#161616"
id="path27" />
<path
d="m33.8 528.4h-33.7v189.4l113.7-86.3z"
fill="#191919"
id="path29" />
<path
d="m135.9 732.6-102.1 109.4h-33.7v-124.2l113.7-86.3z"
fill="#161616"
id="path31" />
<path
d="m135.9 732.6 137.9-14.7-35.8-170.5-124.2 84.2z"
fill="#111"
id="path33" />
<path
d="m135.9 732.6 137.9-14.7-16.9 124.1h-121z"
fill="#0e0e0e"
id="path35" />
<path
d="m421.1 799.9-147.3-82.1-16.9 124.2h164.2z"
fill="#080808"
id="path37" />
<path
d="m421.1 799.9-147.3-82.1 147.3-128.4z"
fill="#070707"
id="path39" />
<path
d="m135.9 732.6-102.1 109.4h102.1z"
fill="#121212"
id="path41" />
<path
d="m286.4 395.8-48.4 151.6-138.9-126.3z"
fill="#151515"
id="path43" />
<path
d="m286.4 395.8-48.4 151.6 160-126.3z"
fill="#111"
id="path45" />
<path
d="m273.8 717.8-35.8-170.4 160-126.3 23.2 37.9v130.5z"
fill="#0d0d0d"
id="path47" />
<path
d="m33.8 528.4-25.2-56.8-8.4-2.1v58.9z"
fill="#1d1d1d"
id="path49" />
<path
d="m147 152.1 133.5-17.8-99.3-134.2h-51z"
fill="#1e1e1e"
id="path51" />
<path
d="m147 152.1 133.5-17.8-133.5 80.5z"
fill="#1b1b1b"
id="path53" />
<path
d="m290.6 303.2-10.1-168.9-133.5 80.5z"
fill="#181818"
id="path55" />
<path
d="m290.6 303.2-191.5 117.9 47.9-206.3z"
fill="#191919"
id="path57" />
<path
d="m290.6 303.2-191.5 117.9 187.3-25.3z"
fill="#161616"
id="path59" />
<path
d="m290.6 303.2 107.3 117.9-111.6-25.3z"
fill="#111"
id="path61" />
<path
d="m290.6 303.2 107.3 117.9 23.2-40.5v-65.8z"
fill="#101010"
id="path63" />
<path
d="m421.1 459-23.2-37.9 23.2-40.5z"
fill="#0c0c0c"
fill-opacity=".95"
id="path65" />
<path
d="m325.9 0.1-45.4 134.2-99.3-134.2z"
fill="#1c1c1c"
id="path67" />
<path
d="m325.9 0.1-45.4 134.2 140.6-24v-110.2z"
fill="#151515"
id="path69" />
<path
d="m421.1 284.8-140.6-150.5 140.6-24z"
fill="#111"
id="path71" />
<path
d="m421.1 284.8-140.6-150.5 10.1 168.9 130.5 11.6z"
fill="#131313"
id="path73" />
</g>
</svg>

After

Width:  |  Height:  |  Size: 5.2 KiB

View File

@ -0,0 +1 @@
<svg enable-background="new 0 0 421.2 842.2" viewBox="0 0 421.2 842.2" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"><linearGradient id="a" gradientTransform="matrix(-343.9457 -596.4179 -596.4179 343.9457 472647.7812 -340718.9688)" gradientUnits="userSpaceOnUse" x1="-87.0285" x2="-86.0285" y1="841.9678" y2="841.9678"><stop offset="0" stop-color="#080808"/><stop offset="1" stop-color="#242424"/></linearGradient><g clip-rule="evenodd" fill-rule="evenodd"><path d="m.1.1h420.9v841.9h-420.9z" style="stroke:#000;stroke-width:.2736;stroke-linecap:round;stroke-linejoin:round;stroke-miterlimit:3.1571;fill:url(#a)"/><path d="m147 152.1-146.9-152h130z" fill="#242424"/><path d="m147 152.1-146.9-152v106.7z" fill="#252525"/><path d="m147 152.1v62.7l-146.9-80.5v-27.5z" fill="#222"/><path d="m.1 268.5 146.9-53.7-146.9-80.5z" fill="#242424"/><path d="m.1 268.5 146.9-53.7-47.9 206.3z" fill="#1f1f1f"/><path d="m.1 268.5v201l8.4 2.1 90.5-50.5z" fill="#1f1f1f"/><path d="m33.8 528.4-25.2-56.8 90.5-50.5z" fill="#1a1a1a"/><path d="m33.8 528.4 204.2 19-138.9-126.3z" fill="#181818"/><path d="m33.8 528.4 204.2 19-124.2 84.2z" fill="#161616"/><path d="m33.8 528.4h-33.7v189.4l113.7-86.3z" fill="#191919"/><path d="m135.9 732.6-102.1 109.4h-33.7v-124.2l113.7-86.3z" fill="#161616"/><path d="m135.9 732.6 137.9-14.7-35.8-170.5-124.2 84.2z" fill="#111"/><path d="m135.9 732.6 137.9-14.7-16.9 124.1h-121z" fill="#0e0e0e"/><path d="m421.1 799.9-147.3-82.1-16.9 124.2h164.2z" fill="#080808"/><path d="m421.1 799.9-147.3-82.1 147.3-128.4z" fill="#070707"/><path d="m135.9 732.6-102.1 109.4h102.1z" fill="#121212"/><path d="m286.4 395.8-48.4 151.6-138.9-126.3z" fill="#151515"/><path d="m286.4 395.8-48.4 151.6 160-126.3z" fill="#111"/><path d="m273.8 717.8-35.8-170.4 160-126.3 23.2 37.9v130.5z" fill="#0d0d0d"/><path d="m33.8 528.4-25.2-56.8-8.4-2.1v58.9z" fill="#1d1d1d"/><path d="m147 152.1 133.5-17.8-99.3-134.2h-51z" fill="#1e1e1e"/><path d="m147 152.1 133.5-17.8-133.5 80.5z" fill="#1b1b1b"/><path d="m290.6 303.2-10.1-168.9-133.5 80.5z" fill="#181818"/><path d="m290.6 303.2-191.5 117.9 47.9-206.3z" fill="#191919"/><path d="m290.6 303.2-191.5 117.9 187.3-25.3z" fill="#161616"/><path d="m290.6 303.2 107.3 117.9-111.6-25.3z" fill="#111"/><path d="m290.6 303.2 107.3 117.9 23.2-40.5v-65.8z" fill="#101010"/><path d="m421.1 459-23.2-37.9 23.2-40.5z" fill="#0c0c0c" fill-opacity=".95"/><path d="m325.9.1-45.4 134.2-99.3-134.2z" fill="#1c1c1c"/><path d="m325.9.1-45.4 134.2 140.6-24v-110.2z" fill="#151515"/><path d="m421.1 284.8-140.6-150.5 140.6-24z" fill="#111"/><path d="m421.1 284.8-140.6-150.5 10.1 168.9 130.5 11.6z" fill="#131313"/></g></svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

39
dirs/mainsail/index.html Normal file
View File

@ -0,0 +1,39 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width,initial-scale=1.0" />
<title>Mainsail</title>
<meta name="description" content="Mainsail is the popular web interface for Klipper." />
<link rel="icon" type="image/png" sizes="32x32" href="/img/icons/favicon-32x32.png" />
<link rel="icon" type="image/png" sizes="16x16" href="/img/icons/favicon-16x16.png" />
<meta name="theme-color" content="#121212" />
<meta name="mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-capable" content="yes" />
<meta name="apple-mobile-web-app-status-bar-style" content="black" />
<meta name="apple-mobile-web-app-title" content="Mainsail" />
<link rel="apple-touch-icon" sizes="180x180" href="/img/icons/apple-touch-icon-180x180.png" />
<link rel="mask-icon" href="img/icons/safari-pinned-tab.svg" color="#d51f26" />
<meta name="msapplication-TileImage" content="/img/icons/mstile-150x150.png" />
<meta name="msapplication-TileColor" content="#d51f26" />
<script type="module" crossorigin src="/assets/index-97b4652c.js"></script>
<link rel="modulepreload" crossorigin href="/assets/vuetify-52f40ce5.js">
<link rel="modulepreload" crossorigin href="/assets/overlayscrollbars-44d87bcf.js">
<link rel="modulepreload" crossorigin href="/assets/echarts-9bc570b0.js">
<link rel="stylesheet" href="/assets/vuetify-950d1cb0.css">
<link rel="stylesheet" href="/assets/overlayscrollbars-a16bc3d3.css">
<link rel="stylesheet" href="/assets/index-57af1108.css">
<link rel="manifest" href="/manifest.webmanifest"></head>
<body style="background-color: #121212">
<noscript>
<strong>
We're sorry but Mainsail doesn't work properly without JavaScript enabled. Please enable it to continue.
</strong>
</noscript>
<div id="app"></div>
</body>
</html>

View File

@ -0,0 +1 @@
{"name":"Mainsail","short_name":"Mainsail","start_url":"/","display":"standalone","background_color":"#121212","lang":"en","scope":"/","theme_color":"#D51F26","icons":[{"src":"/img/icons/icon-192-maskable.png","sizes":"192x192","type":"image/png"},{"src":"/img/icons/icon-512-maskable.png","sizes":"512x512","type":"image/png"},{"src":"/img/icons/icon-512-maskable.png","sizes":"512x512","type":"image/png","purpose":"any maskable"}]}

View File

@ -0,0 +1 @@
{"project_name":"mainsail","project_owner":"mainsail-crew","version":"v2.9.1"}

1
dirs/mainsail/sw.js Normal file

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

1
dirs/moonraker Submodule

@ -0,0 +1 @@
Subproject commit 67c98f6a7610ff4196954a665e5599bea9ccf5ac

View File

@ -0,0 +1 @@
bc16b7b6eb614f20b555dde96de3080f

View File

@ -0,0 +1,90 @@
[server]
host: 0.0.0.0
port: 7125
# The maximum size allowed for a file upload (in MiB). Default 1024 MiB
max_upload_size: 1024
# Path to klippy Unix Domain Socket
klippy_uds_address: ~/printer_data/comms/klippy.sock
[file_manager]
# post processing for object cancel. Not recommended for low resource SBCs such as a Pi Zero. Default False
enable_object_processing: False
[authorization]
cors_domains:
https://my.mainsail.xyz
http://my.mainsail.xyz
http://*.local
http://*.lan
trusted_clients:
10.0.0.0/8
127.0.0.0/8
169.254.0.0/16
172.16.0.0/12
192.168.0.0/16
FE80::/10
::1/128
# enables partial support of Octoprint API
[octoprint_compat]
# enables moonraker to track and store print history.
[history]
# this enables moonraker announcements for mainsail
[announcements]
subscriptions:
mainsail
# this enables moonraker's update manager
[update_manager]
refresh_interval: 168
enable_auto_refresh: True
[update_manager mainsail]
type: web
channel: stable
repo: mainsail-crew/mainsail
path: ~/mainsail
[update_manager mainsail-config]
type: git_repo
primary_branch: master
path: ~/mainsail-config
origin: https://github.com/mainsail-crew/mainsail-config.git
managed_services: klipper
### moonraker-timelapse
### Don't forget to include timelapse.cfg to your printer.cfg
### Uncomment to enable moonraker-timelapse
#[update_manager timelapse]
#type: git_repo
#primary_branch: main
#path: ~/moonraker-timelapse
#origin: https://github.com/mainsail-crew/moonraker-timelapse.git
#managed_services: klipper moonraker
#[timelapse]
### Directory where the generated video will be saved
#output_path: ~/timelapse/
### Directory where ffmpeg is installed
#ffmpeg_binary_path: /usr/bin/ffmpeg
# Crowsnest update_manager entry
[update_manager crowsnest]
type: git_repo
path: ~/crowsnest
origin: https://github.com/mainsail-crew/crowsnest.git
managed_services: crowsnest
install_script: tools/pkglist.sh
# Sonar update_manager entry
[update_manager sonar]
type: git_repo
path: ~/sonar
origin: https://github.com/mainsail-crew/sonar.git
primary_branch: main
managed_services: sonar
install_script: tools/install.sh

View File

@ -0,0 +1 @@
/dev/pts/0

View File

@ -0,0 +1,64 @@
[server]
host = 0.0.0.0
port = 7126
max_upload_size = 1024
klippy_uds_address = ~/taz/printer_data_taz/comms/klippy.sock
[file_manager]
enable_object_processing = False
[authorization]
cors_domains =
https://my.mainsail.xyz
http://my.mainsail.xyz
http://*.local
http://*.lan
trusted_clients =
10.0.0.0/8
127.0.0.0/8
169.254.0.0/16
172.16.0.0/12
192.168.0.0/16
FE80::/10
::1/128
[octoprint_compat]
[history]
[announcements]
subscriptions =
mainsail
[update_manager]
refresh_interval = 168
enable_auto_refresh = True
[update_manager mainsail]
type = web
channel = stable
repo = mainsail-crew/mainsail
path = ~/mainsail
[update_manager mainsail-config]
type = git_repo
primary_branch = master
path = ~/taz/mainsail-config
origin = https://github.com/mainsail-crew/mainsail-config.git
managed_services = klipper
[update_manager crowsnest]
type = git_repo
path = ~/crowsnest
origin = https://github.com/mainsail-crew/crowsnest.git
managed_services = crowsnest
install_script = tools/pkglist.sh
[update_manager sonar]
type = git_repo
path = ~/sonar
origin = https://github.com/mainsail-crew/sonar.git
primary_branch = main
managed_services = sonar
install_script = tools/install.sh

@ -0,0 +1 @@
Subproject commit b0692e0f798d3e05aefaf501383113657e34942b

@ -0,0 +1 @@
Subproject commit 0a1c82a144b2c68ecb37030cfd08493b9f2b1b23

View File

@ -0,0 +1,47 @@
#### crowsnest.conf
#### This is a typical default config.
#### Also used as default in mainsail / MainsailOS
#### See:
#### https://github.com/mainsail-crew/crowsnest/blob/master/README.md
#### for details to configure to your needs.
#####################################################################
#### #####
#### Information about ports and according URL's #####
#### #####
#####################################################################
#### #####
#### Port 8080 equals /webcam/?action=[stream/snapshot] #####
#### Port 8081 equals /webcam2/?action=[stream/snapshot] #####
#### Port 8082 equals /webcam3/?action=[stream/snapshot] #####
#### Port 8083 equals /webcam4/?action=[stream/snapshot] #####
#### #####
#### Note: These ports are default for most Mainsail #####
#### installations. To use any other port would involve #####
#### changing the proxy configuration or using directly #####
#### http://<ip>:<port>/?action=[stream/snapshot] #####
#### #####
#####################################################################
#### RTSP Stream URL: ( if enabled and supported ) #####
#### rtsp://<ip>:<rtsp_port>/stream.h264 #####
#####################################################################
[crowsnest]
log_path: /home/pi/printer_data/logs/crowsnest.log
log_level: verbose # Valid Options are quiet/verbose/debug
delete_log: false # Deletes log on every restart, if set to true
no_proxy: false
[cam 1]
mode: camera-streamer # ustreamer - Provides mjpg and snapshots. (All devices)
# camera-streamer - Provides webrtc, mjpg and snapshots. (rpi + Raspi OS based only)
enable_rtsp: false # If camera-streamer is used, this enables also usage of an rtsp server
rtsp_port: 8554 # Set different ports for each device!
port: 8080 # HTTP/MJPG Stream/Snapshot Port
device: /dev/v4l/by-id/usb-Generic_USB2.0_PC_CAMERA-video-index0 # See Log for available ...
resolution: 640x480 # widthxheight format
max_fps: 30 # If Hardware Supports this it will be forced, otherwise ignored/coerced.
#custom_flags: # You can run the Stream Services with custom flags.
#v4l2ctl: # Add v4l2-ctl parameters to setup your camera, see Log what your cam is capable of.

View File

@ -0,0 +1,294 @@
## Client klipper macro definitions
##
## Copyright (C) 2022 Alex Zellner <alexander.zellner@googlemail.com>
##
## This file may be distributed under the terms of the GNU GPLv3 license
##
## !!! This file is read-only. Maybe the used editor indicates that. !!!
##
## Customization:
## 1) copy the gcode_macro _CLIENT_VARIABLE (see below) to your printer.cfg
## 2) remove the comment mark (#) from all lines
## 3) change any value in there to your needs
##
## Use the PAUSE macro direct in your M600:
## e.g. with a different park position front left and a minimal height of 50
## [gcode_macro M600]
## description: Filament change
## gcode: PAUSE X=10 Y=10 Z_MIN=50
## Z_MIN will park the toolhead at a minimum of 50 mm above to bed to make it easier for you to swap filament.
##
## Client variable macro for your printer.cfg
#[gcode_macro _CLIENT_VARIABLE]
#variable_use_custom_pos : False ; use custom park coordinates for x,y [True/False]
#variable_custom_park_x : 0.0 ; custom x position; value must be within your defined min and max of X
#variable_custom_park_y : 0.0 ; custom y position; value must be within your defined min and max of Y
#variable_custom_park_dz : 2.0 ; custom dz value; the value in mm to lift the nozzle when move to park position
#variable_retract : 1.0 ; the value to retract while PAUSE
#variable_cancel_retract : 5.0 ; the value to retract while CANCEL_PRINT
#variable_speed_retract : 35.0 ; retract speed in mm/s
#variable_unretract : 1.0 ; the value to unretract while RESUME
#variable_speed_unretract : 35.0 ; unretract speed in mm/s
#variable_speed_hop : 15.0 ; z move speed in mm/s
#variable_speed_move : 100.0 ; move speed in mm/s
#variable_park_at_cancel : False ; allow to move the toolhead to park while execute CANCEL_PRINT [True/False]
#variable_park_at_cancel_x : None ; different park position during CANCEL_PRINT [None/Position as Float]; park_at_cancel must be True
#variable_park_at_cancel_y : None ; different park position during CANCEL_PRINT [None/Position as Float]; park_at_cancel must be True
## !!! Caution [firmware_retraction] must be defined in the printer.cfg if you set use_fw_retract: True !!!
#variable_use_fw_retract : False ; use fw_retraction instead of the manual version [True/False]
#variable_idle_timeout : 0 ; time in sec until idle_timeout kicks in. Value 0 means that no value will be set or restored
#variable_runout_sensor : "" ; If a sensor is defined, it will be used to cancel the execution of RESUME in case no filament is detected.
## Specify the config name of the runout sensor e.g "filament_switch_sensor runout". Hint use the same as in your printer.cfg
## !!! Custom macros, please use with care and review the section of the corresponding macro.
## These macros are for simple operations like setting a status LED. Please make sure your macro does not interfere with the basic macro functions.
## Only single line commands are supported, please create a macro if you need more than one command.
#variable_user_pause_macro : "" ; Everything inside the "" will be executed after the klipper base pause (PAUSE_BASE) function
#variable_user_resume_macro: "" ; Everything inside the "" will be executed before the klipper base resume (RESUME_BASE) function
#variable_user_cancel_macro: "" ; Everything inside the "" will be executed before the klipper base cancel (CANCEL_PRINT_BASE) function
#gcode:
[virtual_sdcard]
path: ~/taz/printer_data_taz/gcodes
on_error_gcode: CANCEL_PRINT
[pause_resume]
#recover_velocity: 50.
# When capture/restore is enabled, the speed at which to return to
# the captured position (in mm/s). Default is 50.0 mm/s.
[display_status]
[respond]
[gcode_macro CANCEL_PRINT]
description: Cancel the actual running print
rename_existing: CANCEL_PRINT_BASE
gcode:
##### get user parameters or use default #####
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set allow_park = client.park_at_cancel|default(false)|lower == 'true' %}
{% set retract = client.cancel_retract|default(5.0)|abs %}
##### define park position #####
{% set park_x = "" if (client.park_at_cancel_x|default(none) is none)
else "X=" ~ client.park_at_cancel_x %}
{% set park_y = "" if (client.park_at_cancel_y|default(none) is none)
else "Y=" ~ client.park_at_cancel_y %}
{% set custom_park = park_x|length > 0 or park_y|length > 0 %}
##### end of definitions #####
# restore idle_timeout time if needed
{% if printer['gcode_macro RESUME'].restore_idle_timeout > 0 %}
SET_IDLE_TIMEOUT TIMEOUT={printer['gcode_macro RESUME'].restore_idle_timeout}
{% endif %}
{% if (custom_park or not printer.pause_resume.is_paused) and allow_park %} _TOOLHEAD_PARK_PAUSE_CANCEL {park_x} {park_y} {% endif %}
_CLIENT_RETRACT LENGTH={retract}
TURN_OFF_HEATERS
M106 S0
{client.user_cancel_macro|default("")}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False
# clear pause_next_layer and pause_at_layer as preparation for next print
SET_PAUSE_NEXT_LAYER ENABLE=0
SET_PAUSE_AT_LAYER ENABLE=0 LAYER=0
CANCEL_PRINT_BASE
[gcode_macro PAUSE]
description: Pause the actual running print
rename_existing: PAUSE_BASE
gcode:
##### get user parameters or use default #####
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set idle_timeout = client.idle_timeout|default(0) %}
{% set temp = printer[printer.toolhead.extruder].target if printer.toolhead.extruder != '' else 0 %}
{% set restore = False if printer.toolhead.extruder == ''
else True if params.RESTORE|default(1)|int == 1 else False %}
##### end of definitions #####
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=last_extruder_temp VALUE="{{'restore': restore, 'temp': temp}}"
# set a new idle_timeout value
{% if idle_timeout > 0 %}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=restore_idle_timeout VALUE={printer.configfile.settings.idle_timeout.timeout}
SET_IDLE_TIMEOUT TIMEOUT={idle_timeout}
{% endif %}
PAUSE_BASE
{client.user_pause_macro|default("")}
_TOOLHEAD_PARK_PAUSE_CANCEL {rawparams}
[gcode_macro RESUME]
description: Resume the actual running print
rename_existing: RESUME_BASE
variable_last_extruder_temp: {'restore': False, 'temp': 0}
variable_restore_idle_timeout: 0
variable_idle_state: False
gcode:
##### get user parameters or use default #####
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set velocity = printer.configfile.settings.pause_resume.recover_velocity %}
{% set sp_move = client.speed_move|default(velocity) %}
{% set runout_resume = True if client.runout_sensor|default("") == "" # no runout
else True if not printer[client.runout_sensor].enabled # sensor is disabled
else printer[client.runout_sensor].filament_detected %} # sensor status
{% set can_extrude = True if printer.toolhead.extruder == '' # no extruder defined in config
else printer[printer.toolhead.extruder].can_extrude %} # status of active extruder
{% set do_resume = False %}
{% set prompt_txt = [] %}
##### end of definitions #####
#### Printer comming from timeout idle state ####
{% if printer.idle_timeout.state|upper == "IDLE" or idle_state %}
SET_GCODE_VARIABLE MACRO=RESUME VARIABLE=idle_state VALUE=False
{% if last_extruder_temp.restore %}
# we need to use the unicode (\u00B0) for the ° as py2 env's would throw an error otherwise
RESPOND TYPE=echo MSG='{"Restoring \"%s\" temperature to %3.1f\u00B0C, this may take some time" % (printer.toolhead.extruder, last_extruder_temp.temp) }'
M109 S{last_extruder_temp.temp}
{% set do_resume = True %}
{% elif can_extrude %}
{% set do_resume = True %}
{% else %}
RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}'
{% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %}
{% endif %}
#### Printer comming out of regular PAUSE state ####
{% elif can_extrude %}
{% set do_resume = True %}
{% else %}
RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder}'
{% set _d = prompt_txt.append("\"%s\" not hot enough, please heat up again and press RESUME" % printer.toolhead.extruder) %}
{% endif %}
{% if runout_resume %}
{% if do_resume %}
{% if restore_idle_timeout > 0 %} SET_IDLE_TIMEOUT TIMEOUT={restore_idle_timeout} {% endif %} # restore idle_timeout time
{client.user_resume_macro|default("")}
_CLIENT_EXTRUDE
RESUME_BASE VELOCITY={params.VELOCITY|default(sp_move)}
{% endif %}
{% else %}
RESPOND TYPE=error MSG='{"Resume aborted !!! \"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]}'
{% set _d = prompt_txt.append("\"%s\" detects no filament, please load filament and press RESUME" % (client.runout_sensor.split(" "))[1]) %}
{% endif %}
##### Generate User Information box in case of abort #####
{% if not (runout_resume and do_resume) %}
RESPOND TYPE=command MSG="action:prompt_begin RESUME aborted !!!"
{% for element in prompt_txt %}
RESPOND TYPE=command MSG='{"action:prompt_text %s" % element}'
{% endfor %}
RESPOND TYPE=command MSG="action:prompt_footer_button Ok|RESPOND TYPE=command MSG=action:prompt_end|info"
RESPOND TYPE=command MSG="action:prompt_show"
{% endif %}
# Usage: SET_PAUSE_NEXT_LAYER [ENABLE=[0|1]] [MACRO=<name>]
[gcode_macro SET_PAUSE_NEXT_LAYER]
description: Enable a pause if the next layer is reached
gcode:
{% set pause_next_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_next_layer %}
{% set ENABLE = params.ENABLE|default(1)|int != 0 %}
{% set MACRO = params.MACRO|default(pause_next_layer.call, True) %}
SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_next_layer VALUE="{{ 'enable': ENABLE, 'call': MACRO }}"
# Usage: SET_PAUSE_AT_LAYER [ENABLE=[0|1]] [LAYER=<number>] [MACRO=<name>]
[gcode_macro SET_PAUSE_AT_LAYER]
description: Enable/disable a pause if a given layer number is reached
gcode:
{% set pause_at_layer = printer['gcode_macro SET_PRINT_STATS_INFO'].pause_at_layer %}
{% set ENABLE = params.ENABLE|int != 0 if params.ENABLE is defined
else params.LAYER is defined %}
{% set LAYER = params.LAYER|default(pause_at_layer.layer)|int %}
{% set MACRO = params.MACRO|default(pause_at_layer.call, True) %}
SET_GCODE_VARIABLE MACRO=SET_PRINT_STATS_INFO VARIABLE=pause_at_layer VALUE="{{ 'enable': ENABLE, 'layer': LAYER, 'call': MACRO }}"
# Usage: SET_PRINT_STATS_INFO [TOTAL_LAYER=<total_layer_count>] [CURRENT_LAYER= <current_layer>]
[gcode_macro SET_PRINT_STATS_INFO]
rename_existing: SET_PRINT_STATS_INFO_BASE
description: Overwrite, to get pause_next_layer and pause_at_layer feature
variable_pause_next_layer: { 'enable': False, 'call': "PAUSE" }
variable_pause_at_layer : { 'enable': False, 'layer': 0, 'call': "PAUSE" }
gcode:
{% if pause_next_layer.enable %}
RESPOND TYPE=echo MSG='{"%s, forced by pause_next_layer" % pause_next_layer.call}'
{pause_next_layer.call} ; execute the given gcode to pause, should be either M600 or PAUSE
SET_PAUSE_NEXT_LAYER ENABLE=0
{% elif pause_at_layer.enable and params.CURRENT_LAYER is defined and params.CURRENT_LAYER|int == pause_at_layer.layer %}
RESPOND TYPE=echo MSG='{"%s, forced by pause_at_layer [%d]" % (pause_at_layer.call, pause_at_layer.layer)}'
{pause_at_layer.call} ; execute the given gcode to pause, should be either M600 or PAUSE
SET_PAUSE_AT_LAYER ENABLE=0
{% endif %}
SET_PRINT_STATS_INFO_BASE {rawparams}
##### internal use #####
[gcode_macro _TOOLHEAD_PARK_PAUSE_CANCEL]
description: Helper: park toolhead used in PAUSE and CANCEL_PRINT
gcode:
##### get user parameters or use default #####
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set velocity = printer.configfile.settings.pause_resume.recover_velocity %}
{% set use_custom = client.use_custom_pos|default(false)|lower == 'true' %}
{% set custom_park_x = client.custom_park_x|default(0.0) %}
{% set custom_park_y = client.custom_park_y|default(0.0) %}
{% set park_dz = client.custom_park_dz|default(2.0)|abs %}
{% set sp_hop = client.speed_hop|default(15) * 60 %}
{% set sp_move = client.speed_move|default(velocity) * 60 %}
##### get config and toolhead values #####
{% set origin = printer.gcode_move.homing_origin %}
{% set act = printer.gcode_move.gcode_position %}
{% set max = printer.toolhead.axis_maximum %}
{% set cone = printer.toolhead.cone_start_z|default(max.z) %} ; height as long the toolhead can reach max and min of an delta
{% set round_bed = True if printer.configfile.settings.printer.kinematics is in ['delta','polar','rotary_delta','winch']
else False %}
##### define park position #####
{% set z_min = params.Z_MIN|default(0)|float %}
{% set z_park = [[(act.z + park_dz), z_min]|max, (max.z - origin.z)]|min %}
{% set x_park = params.X if params.X is defined
else custom_park_x if use_custom
else 0.0 if round_bed
else (max.x - 5.0) %}
{% set y_park = params.Y if params.Y is defined
else custom_park_y if use_custom
else (max.y - 5.0) if round_bed and z_park < cone
else 0.0 if round_bed
else (max.y - 5.0) %}
##### end of definitions #####
_CLIENT_RETRACT
{% if "xyz" in printer.toolhead.homed_axes %}
G90
G1 Z{z_park} F{sp_hop}
G1 X{x_park} Y{y_park} F{sp_move}
{% if not printer.gcode_move.absolute_coordinates %} G91 {% endif %}
{% else %}
RESPOND TYPE=echo MSG='Printer not homed'
{% endif %}
[gcode_macro _CLIENT_EXTRUDE]
description: Extrudes, if the extruder is hot enough
gcode:
##### get user parameters or use default #####
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set use_fw_retract = (client.use_fw_retract|default(false)|lower == 'true') and (printer.firmware_retraction is defined) %}
{% set length = params.LENGTH|default(client.unretract)|default(1.0)|float %}
{% set speed = params.SPEED|default(client.speed_unretract)|default(35) %}
{% set absolute_extrude = printer.gcode_move.absolute_extrude %}
##### end of definitions #####
{% if printer.toolhead.extruder != '' %}
{% if printer[printer.toolhead.extruder].can_extrude %}
{% if use_fw_retract %}
{% if length < 0 %}
G10
{% else %}
G11
{% endif %}
{% else %}
M83
G1 E{length} F{(speed|float|abs) * 60}
{% if absolute_extrude %}
M82
{% endif %}
{% endif %}
{% else %}
RESPOND TYPE=echo MSG='{"\"%s\" not hot enough" % printer.toolhead.extruder}'
{% endif %}
{% endif %}
[gcode_macro _CLIENT_RETRACT]
description: Retracts, if the extruder is hot enough
gcode:
{% set client = printer['gcode_macro _CLIENT_VARIABLE']|default({}) %}
{% set length = params.LENGTH|default(client.retract)|default(1.0)|float %}
{% set speed = params.SPEED|default(client.speed_retract)|default(35) %}
_CLIENT_EXTRUDE LENGTH=-{length|float|abs} SPEED={speed|float|abs}

View File

@ -0,0 +1,90 @@
[server]
host: 0.0.0.0
port: 7126
# The maximum size allowed for a file upload (in MiB). Default 1024 MiB
max_upload_size: 1024
# Path to klippy Unix Domain Socket
klippy_uds_address: ~/taz/printer_data_taz/comms/klippy.sock
[file_manager]
# post processing for object cancel. Not recommended for low resource SBCs such as a Pi Zero. Default False
enable_object_processing: False
[authorization]
cors_domains:
https://my.mainsail.xyz
http://my.mainsail.xyz
http://*.local
http://*.lan
trusted_clients:
10.0.0.0/8
127.0.0.0/8
169.254.0.0/16
172.16.0.0/12
192.168.0.0/16
FE80::/10
::1/128
# enables partial support of Octoprint API
[octoprint_compat]
# enables moonraker to track and store print history.
[history]
# this enables moonraker announcements for mainsail
[announcements]
subscriptions:
mainsail
# this enables moonraker's update manager
[update_manager]
refresh_interval: 168
enable_auto_refresh: True
[update_manager mainsail]
type: web
channel: stable
repo: mainsail-crew/mainsail
path: ~/mainsail
[update_manager mainsail-config]
type: git_repo
primary_branch: master
path: ~/taz/mainsail-config
origin: https://github.com/mainsail-crew/mainsail-config.git
managed_services: klipper
### moonraker-timelapse
### Don't forget to include timelapse.cfg to your printer.cfg
### Uncomment to enable moonraker-timelapse
#[update_manager timelapse]
#type: git_repo
#primary_branch: main
#path: ~/moonraker-timelapse
#origin: https://github.com/mainsail-crew/moonraker-timelapse.git
#managed_services: klipper moonraker
#[timelapse]
### Directory where the generated video will be saved
#output_path: ~/timelapse/
### Directory where ffmpeg is installed
#ffmpeg_binary_path: /usr/bin/ffmpeg
# Crowsnest update_manager entry
[update_manager crowsnest]
type: git_repo
path: ~/crowsnest
origin: https://github.com/mainsail-crew/crowsnest.git
managed_services: crowsnest
install_script: tools/pkglist.sh
# Sonar update_manager entry
[update_manager sonar]
type: git_repo
path: ~/sonar
origin: https://github.com/mainsail-crew/sonar.git
primary_branch: main
managed_services: sonar
install_script: tools/install.sh

View File

@ -0,0 +1 @@
/home/pi/mainsail-config/mainsail.cfg

View File

@ -0,0 +1,220 @@
# This file contains common pin mappings for RAMBo boards. To use this
# config, the firmware should be compiled for the AVR atmega2560.
# See docs/Config_Reference.md for a description of parameters.
[gcode_macro CALIBRATE_NOZZLE_OFFSET]
description: Move to center of bed and calibrate nozzle offset
gcode:
G90
G0 X100 Y155 F1500
PROBE_CALIBRATE
[gcode_macro LEVEL_BED]
description: "Level the bed manually."
gcode:
BED_SCREWS_ADJUST
[gcode_macro CHECK_DEVIATION]
description: "Check the deviation of the bed from the last loaded mesh."
gcode:
SCREWS_TILT_CALCULATE MAX_DEVIATION=0.05
[gcode_macro LIZ_IS_A_BAKA]
description: "Liz is a baka, so here's her start G-Code >.<"
gcode:
BED_MESH_CALIBRATE
BED_MESH_PROFILE SAVE=default
[gcode_macro _START_GCODE]
description: "The gcode that should be called from your slicer at the beginning of a print."
gcode:
# Ender 3 Custom Start G-code
G90
G1 X2 Y30 Z30 F1500
G1 Z0.28 F240
G92 E0
G1 Y220 E10 F1500 ; prime the nozzle
G1 X2.3 F5000
G92 E0
G1 Y30 E10 F1200 ; prime the nozzle
G92 E0
G1 Z5 F1500 ; don't scratch the build plate
[gcode_macro _END_GCODE]
description: "The gcode that should be called from your slicer at the end of a print."
gcode:
G91 # Relative positioning
G1 E-2 F2700 # Retract a bit
G1 E-2 Z0.2 F2400 # Retract and raise Z
G1 X5 Y5 F3000 # Wipe out
G1 Z10 # Raise Z more
G90 # Absolute positioning
G1 X0 Y220 # Present print
M106 S0 # Turn-off fan
M104 S0 # Turn-off hotend
M140 S0 # Turn-off bed
M84 X Y E # Disable all steppers but Z
[stepper_x]
step_pin: PC0
dir_pin: PL1
enable_pin: !PA7
microsteps: 16
# rotation_distance: 40 # Default, seems 3mm short on a 10mm move
# rotation_distance: 28 # Test 1, seems to move 1-2mm too far
# rotation_distance: 30 # Test 2, seems to move 1mm too far
rotation_distance: 33
endstop_pin: ^!PB6
#endstop_pin: ^PA2
position_endstop: 0
position_max: 298
homing_speed: 50
[stepper_y]
step_pin: PC1
dir_pin: !PL0
enable_pin: !PA6
microsteps: 16
rotation_distance: 40 # Default, Seems ok
endstop_pin: ^!PB5
#endstop_pin: ^PA1
position_endstop: 0
position_max: 280
homing_speed: 50
[stepper_z]
step_pin: PC2
dir_pin: PL2
enable_pin: !PA5
microsteps: 16
# rotation_distance: 8 # Default, seems 1mm too short
# rotation_distance: 7.2 # Test 1, seems 3mm overshot
# rotation_distance: 8.33 # Test 2, still seems 1mm under
rotation_distance: 8
endstop_pin: probe:z_virtual_endstop
#endstop_pin: !PB4
#endstop_pin: ^PC7
# position_endstop: 0.5
position_max: 250
[bltouch]
sensor_pin: ^PB4
control_pin: PL5
x_offset: -33.0
y_offset: 9.0
z_offset: 3.0
[bed_mesh]
speed: 120
horizontal_move_z: 7
mesh_min: 30, 40
mesh_max: 280, 270
probe_count: 5
mesh_pps: 3
algorithm: bicubic
[safe_z_home]
home_xy_position: 140, 140
speed: 50
z_hop: 10
z_hop_speed: 5
[extruder]
step_pin: PC3
dir_pin: !PL6
enable_pin: !PA4
microsteps: 16
# rotation_distance: 33.500 # Original Setting, seems ??x too small
# rotation_distance: 16.75 # Initial test, seems to extrude 1/2 supposed
# rotation_distance: 8.375 # Test Two, still seems 1/2
rotation_distance: 4.25
nozzle_diameter: 0.400
heater_pin: PH6
filament_diameter: 2.850
#filament_diameter: 1.750
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PF0
control: pid
pid_Kp: 22.2
pid_Ki: 1.08
pid_Kd: 114
min_temp: 0
max_temp: 250
#[extruder1]
#step_pin: PC4
#dir_pin: PL7
#enable_pin: !PA3
#heater_pin: PH4
#sensor_pin: PF1
#...
[heater_bed]
heater_pin: PE5
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PF2
control: watermark
min_temp: 0
max_temp: 130
max_power: 1.0
[verify_heater heater_bed]
heating_gain: 1
check_gain_time: 60
[fan]
pin: PH5
#[heater_fan heatbreak_cooling_fan]
#pin: PH3
[mcu]
serial: /dev/serial/by-id/usb-UltiMachine__ultimachine.com__RAMBo_6403335373035101E171-if00
baud: 250000
[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_z_velocity: 5
max_z_accel: 100
[ad5206 stepper_digipot]
enable_pin: PD7
# Scale the config so that the channel value can be specified in amps.
# (For Rambo v1.0d boards, use 1.56 instead.)
scale: 2.08
# Channel 1 is E0, 2 is E1, 3 is unused, 4 is Z, 5 is X, 6 is Y
channel_1: 1.34
channel_2: 1.0
channel_4: 1.1
channel_5: 1.1
channel_6: 1.1
# Enable 16 micro-steps on steppers X, Y, Z, E0, E1
[static_digital_output stepper_config]
pins:
PG1, PG0,
PK7, PG2,
PK6, PK5,
PK3, PK4,
PK1, PK2
[static_digital_output yellow_led]
pins: !PB7
# Common EXP1 / EXP2 (display) pins
[board_pins]
aliases:
# Common EXP1/EXP2 headers found on RAMBo v1.4
EXP1_1=PE6, EXP1_3=PG3, EXP1_5=PJ2, EXP1_7=PJ7, EXP1_9=<GND>,
EXP1_2=PE2, EXP1_4=PG4, EXP1_6=PJ3, EXP1_8=PJ4, EXP1_10=<5V>,
# EXP2 header
EXP2_1=PB3, EXP2_3=PJ5, EXP2_5=PJ6, EXP2_7=PD4, EXP2_9=<GND>,
EXP2_2=PB1, EXP2_4=PB0, EXP2_6=PB2, EXP2_8=PE7, EXP2_10=PH2
# Pins EXP2_1, EXP2_6, EXP2_2 are also MISO, MOSI, SCK of bus "spi"
# See the sample-lcd.cfg file for definitions of common LCD displays.
[include mainsail.cfg]

View File

@ -0,0 +1,228 @@
# This file contains common pin mappings for RAMBo boards. To use this
# config, the firmware should be compiled for the AVR atmega2560.
# See docs/Config_Reference.md for a description of parameters.
[gcode_macro CALIBRATE_NOZZLE_OFFSET]
description: Move to center of bed and calibrate nozzle offset
gcode:
G90
G0 X100 Y155 F1500
PROBE_CALIBRATE
[gcode_macro LEVEL_BED]
description: "Level the bed manually."
gcode:
BED_SCREWS_ADJUST
[gcode_macro CHECK_DEVIATION]
description: "Check the deviation of the bed from the last loaded mesh."
gcode:
SCREWS_TILT_CALCULATE MAX_DEVIATION=0.05
[gcode_macro LIZ_IS_A_BAKA]
description: "Liz is a baka, so here's her start G-Code >.<"
gcode:
BED_MESH_CALIBRATE
BED_MESH_PROFILE SAVE=default
[gcode_macro _START_GCODE]
description: "The gcode that should be called from your slicer at the beginning of a print."
gcode:
# Ender 3 Custom Start G-code
G90
G1 X2 Y30 Z30 F1500
G1 Z0.28 F240
G92 E0
G1 Y220 E10 F1500 ; prime the nozzle
G1 X2.3 F5000
G92 E0
G1 Y30 E10 F1200 ; prime the nozzle
G92 E0
G1 Z5 F1500 ; don't scratch the build plate
[gcode_macro _END_GCODE]
description: "The gcode that should be called from your slicer at the end of a print."
gcode:
G91 # Relative positioning
G1 E-2 F2700 # Retract a bit
G1 E-2 Z0.2 F2400 # Retract and raise Z
G1 X5 Y5 F3000 # Wipe out
G1 Z10 # Raise Z more
G90 # Absolute positioning
G1 X0 Y220 # Present print
M106 S0 # Turn-off fan
M104 S0 # Turn-off hotend
M140 S0 # Turn-off bed
M84 X Y E # Disable all steppers but Z
[stepper_x]
step_pin: PC0
dir_pin: PL1
enable_pin: !PA7
microsteps: 16
# rotation_distance: 40 # Default, seems 3mm short on a 10mm move
# rotation_distance: 28 # Test 1, seems to move 1-2mm too far
# rotation_distance: 30 # Test 2, seems to move 1mm too far
rotation_distance: 33
endstop_pin: ^!PB6
#endstop_pin: ^PA2
position_endstop: 0
position_max: 298
homing_speed: 50
[stepper_y]
step_pin: PC1
dir_pin: !PL0
enable_pin: !PA6
microsteps: 16
# rotation_distance: 40 # Default, Seems 4mm overshot
# rotation_distance: 42 # Test 1, Still seems 3-4mm overshot
rotation_distance: 46
endstop_pin: ^!PB5
#endstop_pin: ^PA1
position_endstop: 0
position_max: 280
homing_speed: 50
[stepper_z]
step_pin: PC2
dir_pin: PL2
enable_pin: !PA5
microsteps: 16
# rotation_distance: 8 # Default, seems 1mm too short
# rotation_distance: 7.2 # Test 1, seems 3mm overshot
# rotation_distance: 8.33 # Test 2, still seems 1mm under
rotation_distance: 8
endstop_pin: probe:z_virtual_endstop
#endstop_pin: !PB4
#endstop_pin: ^PC7
# position_endstop: 0.5
position_max: 250
[bltouch]
sensor_pin: ^PB4
control_pin: PL5
x_offset: -33.0
y_offset: 9.0
#z_offset: 3.0
[bed_mesh]
speed: 120
horizontal_move_z: 7
mesh_min: 30, 40
mesh_max: 250, 230
probe_count: 5
mesh_pps: 3
algorithm: bicubic
[safe_z_home]
home_xy_position: 140, 140
speed: 50
z_hop: 10
z_hop_speed: 5
[extruder]
step_pin: PC3
dir_pin: !PL6
enable_pin: !PA4
microsteps: 16
# rotation_distance: 33.500 # Original Setting, seems ??x too small
# rotation_distance: 16.75 # Initial test, seems to extrude 1/2 supposed
# rotation_distance: 8.375 # Test Two, still seems 1/2
rotation_distance: 4.25
nozzle_diameter: 0.400
heater_pin: PH6
filament_diameter: 2.850
#filament_diameter: 1.750
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PF0
control: pid
pid_Kp: 22.2
pid_Ki: 1.08
pid_Kd: 114
min_temp: 0
max_temp: 250
#[extruder1]
#step_pin: PC4
#dir_pin: PL7
#enable_pin: !PA3
#heater_pin: PH4
#sensor_pin: PF1
#...
[heater_bed]
heater_pin: PE5
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PF2
control: watermark
min_temp: 0
max_temp: 130
max_power: 1.0
[verify_heater heater_bed]
heating_gain: 1
check_gain_time: 60
[fan]
pin: PH5
#[heater_fan heatbreak_cooling_fan]
#pin: PH3
[mcu]
serial: /dev/serial/by-id/usb-UltiMachine__ultimachine.com__RAMBo_6403335373035101E171-if00
baud: 250000
[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_z_velocity: 5
max_z_accel: 100
[ad5206 stepper_digipot]
enable_pin: PD7
# Scale the config so that the channel value can be specified in amps.
# (For Rambo v1.0d boards, use 1.56 instead.)
scale: 2.08
# Channel 1 is E0, 2 is E1, 3 is unused, 4 is Z, 5 is X, 6 is Y
channel_1: 1.34
channel_2: 1.0
channel_4: 1.1
channel_5: 1.1
channel_6: 1.1
# Enable 16 micro-steps on steppers X, Y, Z, E0, E1
[static_digital_output stepper_config]
pins:
PG1, PG0,
PK7, PG2,
PK6, PK5,
PK3, PK4,
PK1, PK2
[static_digital_output yellow_led]
pins: !PB7
# Common EXP1 / EXP2 (display) pins
[board_pins]
aliases:
# Common EXP1/EXP2 headers found on RAMBo v1.4
EXP1_1=PE6, EXP1_3=PG3, EXP1_5=PJ2, EXP1_7=PJ7, EXP1_9=<GND>,
EXP1_2=PE2, EXP1_4=PG4, EXP1_6=PJ3, EXP1_8=PJ4, EXP1_10=<5V>,
# EXP2 header
EXP2_1=PB3, EXP2_3=PJ5, EXP2_5=PJ6, EXP2_7=PD4, EXP2_9=<GND>,
EXP2_2=PB1, EXP2_4=PB0, EXP2_6=PB2, EXP2_8=PE7, EXP2_10=PH2
# Pins EXP2_1, EXP2_6, EXP2_2 are also MISO, MOSI, SCK of bus "spi"
# See the sample-lcd.cfg file for definitions of common LCD displays.
[include mainsail.cfg]
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [bltouch]
#*# z_offset = 2.288

View File

@ -0,0 +1,249 @@
# This file contains common pin mappings for RAMBo boards. To use this
# config, the firmware should be compiled for the AVR atmega2560.
# See docs/Config_Reference.md for a description of parameters.
[gcode_macro CALIBRATE_NOZZLE_OFFSET]
description: Move to center of bed and calibrate nozzle offset
gcode:
G90
G0 X100 Y155 F1500
PROBE_CALIBRATE
[gcode_macro LEVEL_BED]
description: "Level the bed manually."
gcode:
BED_SCREWS_ADJUST
[gcode_macro CHECK_DEVIATION]
description: "Check the deviation of the bed from the last loaded mesh."
gcode:
SCREWS_TILT_CALCULATE MAX_DEVIATION=0.05
[gcode_macro LIZ_IS_A_BAKA]
description: "Liz is a baka, so here's her start G-Code >.<"
gcode:
BED_MESH_CALIBRATE
BED_MESH_PROFILE SAVE=default
[gcode_macro _START_GCODE]
description: "The gcode that should be called from your slicer at the beginning of a print."
gcode:
# Ender 3 Custom Start G-code
G90
G1 X2 Y30 Z30 F1500
G1 Z0.28 F240
G92 E0
G1 Y220 E10 F1500 ; prime the nozzle
G1 X2.3 F5000
G92 E0
G1 Y30 E10 F1200 ; prime the nozzle
G92 E0
G1 Z5 F1500 ; don't scratch the build plate
[gcode_macro _END_GCODE]
description: "The gcode that should be called from your slicer at the end of a print."
gcode:
G91 # Relative positioning
G1 E-2 F2700 # Retract a bit
G1 E-2 Z0.2 F2400 # Retract and raise Z
G1 X5 Y5 F3000 # Wipe out
G1 Z10 # Raise Z more
G90 # Absolute positioning
G1 X0 Y220 # Present print
M106 S0 # Turn-off fan
M104 S0 # Turn-off hotend
M140 S0 # Turn-off bed
M84 X Y E # Disable all steppers but Z
[stepper_x]
step_pin: PC0
dir_pin: PL1
enable_pin: !PA7
microsteps: 16
# rotation_distance: 40 # Default, seems 3mm short on a 10mm move
# rotation_distance: 28 # Test 1, seems to move 1-2mm too far
# rotation_distance: 30 # Test 2, seems to move 1mm too far
rotation_distance: 33
endstop_pin: ^!PB6
#endstop_pin: ^PA2
position_endstop: 0
position_max: 298
homing_speed: 50
[stepper_y]
step_pin: PC1
dir_pin: !PL0
enable_pin: !PA6
microsteps: 16
# rotation_distance: 40 # Default, Seems 4mm overshot
# rotation_distance: 42 # Test 1, Still seems 3-4mm overshot
rotation_distance: 46
endstop_pin: ^!PB5
#endstop_pin: ^PA1
position_endstop: 0
position_max: 280
homing_speed: 50
[stepper_z]
step_pin: PC2
dir_pin: PL2
enable_pin: !PA5
microsteps: 16
# rotation_distance: 8 # Default, seems 1mm too short
# rotation_distance: 7.2 # Test 1, seems 3mm overshot
# rotation_distance: 8.33 # Test 2, still seems 1mm under
rotation_distance: 8
endstop_pin: probe:z_virtual_endstop
#endstop_pin: !PB4
#endstop_pin: ^PC7
# position_endstop: 0.5
position_max: 250
[bltouch]
sensor_pin: ^PB4
control_pin: PL5
x_offset: -33.0
y_offset: 9.0
#z_offset: 3.0
[bed_mesh]
speed: 120
horizontal_move_z: 7
mesh_min: 30, 40
mesh_max: 250, 230
probe_count: 5
mesh_pps: 3
algorithm: bicubic
[safe_z_home]
home_xy_position: 140, 140
speed: 50
z_hop: 10
z_hop_speed: 5
[extruder]
step_pin: PC3
dir_pin: !PL6
enable_pin: !PA4
microsteps: 16
# rotation_distance: 33.500 # Original Setting, seems ??x too small
# rotation_distance: 16.75 # Initial test, seems to extrude 1/2 supposed
# rotation_distance: 8.375 # Test Two, still seems 1/2
# rotation_distance: 4.25 # Old Extruder Setup
rotation_distance: 7.9797 # Copied from Replimat
nozzle_diameter: 0.400
heater_pin: PH6
# filament_diameter: 2.850
filament_diameter: 1.750
# sensor_type: EPCOS 100K B57560G104F # Either it's not connecting right, or this is the wronf sensor
sensor_type: NTC 100K MGB18-104F39050L32 # Probably just disconnected
sensor_pin: PF0
control: pid
pid_Kp: 22.2
pid_Ki: 1.08
pid_Kd: 114
min_temp: 0
max_temp: 990
#[extruder1]
#step_pin: PC4
#dir_pin: PL7
#enable_pin: !PA3
#heater_pin: PH4
#sensor_pin: PF1
#...
[heater_bed]
heater_pin: PE5
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PF2
control: watermark
min_temp: 0
max_temp: 130
max_power: 1.0
[verify_heater heater_bed]
heating_gain: 1
check_gain_time: 60
[fan]
pin: PH3
[heater_fan heatbreak_cooling_fan]
pin: PH5
[mcu]
serial: /dev/serial/by-id/usb-UltiMachine__ultimachine.com__RAMBo_6403335373035101E171-if00
baud: 250000
[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_z_velocity: 5
max_z_accel: 100
[ad5206 stepper_digipot]
enable_pin: PD7
# Scale the config so that the channel value can be specified in amps.
# (For Rambo v1.0d boards, use 1.56 instead.)
scale: 2.08
# Channel 1 is E0, 2 is E1, 3 is unused, 4 is Z, 5 is X, 6 is Y
channel_1: 1.34
channel_2: 1.0
channel_4: 1.1
channel_5: 1.1
channel_6: 1.1
# Enable 16 micro-steps on steppers X, Y, Z, E0, E1
[static_digital_output stepper_config]
pins:
PG1, PG0,
PK7, PG2,
PK6, PK5,
PK3, PK4,
PK1, PK2
[static_digital_output yellow_led]
pins: !PB7
# Common EXP1 / EXP2 (display) pins
[board_pins]
aliases:
# Common EXP1/EXP2 headers found on RAMBo v1.4
EXP1_1=PE6, EXP1_3=PG3, EXP1_5=PJ2, EXP1_7=PJ7, EXP1_9=<GND>,
EXP1_2=PE2, EXP1_4=PG4, EXP1_6=PJ3, EXP1_8=PJ4, EXP1_10=<5V>,
# EXP2 header
EXP2_1=PB3, EXP2_3=PJ5, EXP2_5=PJ6, EXP2_7=PD4, EXP2_9=<GND>,
EXP2_2=PB1, EXP2_4=PB0, EXP2_6=PB2, EXP2_8=PE7, EXP2_10=PH2
# Pins EXP2_1, EXP2_6, EXP2_2 are also MISO, MOSI, SCK of bus "spi"
# See the sample-lcd.cfg file for definitions of common LCD displays.
[include mainsail.cfg]
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [bltouch]
#*# z_offset = 2.288
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# -1.065000, -0.857500, -0.817500, -0.865000, -0.927500
#*# -0.592500, -0.502500, -0.442500, -0.482500, -0.522500
#*# -0.172500, -0.070000, -0.027500, -0.040000, -0.057500
#*# 0.182500, 0.265000, 0.312500, 0.302500, 0.332500
#*# 0.480000, 0.610000, 0.670000, 0.715000, 0.735000
#*# x_count = 5
#*# y_count = 5
#*# mesh_x_pps = 3
#*# mesh_y_pps = 3
#*# algo = bicubic
#*# tension = 0.2
#*# min_x = 30.0
#*# max_x = 250.0
#*# min_y = 39.989999999999995
#*# max_y = 230.0

View File

@ -0,0 +1,255 @@
# This file contains common pin mappings for RAMBo boards. To use this
# config, the firmware should be compiled for the AVR atmega2560.
# See docs/Config_Reference.md for a description of parameters.
[gcode_macro CALIBRATE_NOZZLE_OFFSET]
description: Move to center of bed and calibrate nozzle offset
gcode:
G90
G0 X100 Y155 F1500
PROBE_CALIBRATE
[gcode_macro LEVEL_BED]
description: "Level the bed manually."
gcode:
BED_SCREWS_ADJUST
[gcode_macro CHECK_DEVIATION]
description: "Check the deviation of the bed from the last loaded mesh."
gcode:
SCREWS_TILT_CALCULATE MAX_DEVIATION=0.05
[gcode_macro LIZ_IS_A_BAKA]
description: "Liz is a baka, so here's her start G-Code >.<"
gcode:
BED_MESH_CALIBRATE
BED_MESH_PROFILE SAVE=default
[gcode_macro _START_GCODE]
description: "The gcode that should be called from your slicer at the beginning of a print."
gcode:
# Ender 3 Custom Start G-code
G90
G1 X2 Y30 Z30 F1500
G1 Z0.28 F240
G92 E0
G1 Y220 E10 F1500 ; prime the nozzle
G1 X2.3 F5000
G92 E0
G1 Y30 E10 F1200 ; prime the nozzle
G92 E0
G1 Z5 F1500 ; don't scratch the build plate
[gcode_macro _END_GCODE]
description: "The gcode that should be called from your slicer at the end of a print."
gcode:
G91 # Relative positioning
G1 E-2 F2700 # Retract a bit
G1 E-2 Z0.2 F2400 # Retract and raise Z
G1 X5 Y5 F3000 # Wipe out
G1 Z10 # Raise Z more
G90 # Absolute positioning
G1 X0 Y220 # Present print
M106 S0 # Turn-off fan
M104 S0 # Turn-off hotend
M140 S0 # Turn-off bed
M84 X Y E # Disable all steppers but Z
[stepper_x]
step_pin: PC0
dir_pin: PL1
enable_pin: !PA7
microsteps: 16
# rotation_distance: 40 # Default, seems 3mm short on a 10mm move
# rotation_distance: 28 # Test 1, seems to move 1-2mm too far
# rotation_distance: 30 # Test 2, seems to move 1mm too far
rotation_distance: 33
endstop_pin: ^!PB6
#endstop_pin: ^PA2
position_endstop: 0
position_max: 298
homing_speed: 50
[stepper_y]
step_pin: PC1
dir_pin: !PL0
enable_pin: !PA6
microsteps: 16
# rotation_distance: 40 # Default, Seems 4mm overshot
# rotation_distance: 42 # Test 1, Still seems 3-4mm overshot
rotation_distance: 46
endstop_pin: ^!PB5
#endstop_pin: ^PA1
position_endstop: 0
position_max: 280
homing_speed: 50
[stepper_z]
step_pin: PC2
dir_pin: PL2
enable_pin: !PA5
microsteps: 16
# rotation_distance: 8 # Default, seems 1mm too short
# rotation_distance: 7.2 # Test 1, seems 3mm overshot
# rotation_distance: 8.33 # Test 2, still seems 1mm under
rotation_distance: 8
endstop_pin: probe:z_virtual_endstop
#endstop_pin: !PB4
#endstop_pin: ^PC7
# position_endstop: 0.5
position_max: 250
[bltouch]
sensor_pin: ^PB4
control_pin: PL5
x_offset: -44
y_offset: 8
z_offset: 3.0
[bed_mesh]
speed: 120
horizontal_move_z: 7
mesh_min: 30, 40
mesh_max: 250, 230
probe_count: 5
mesh_pps: 3
algorithm: bicubic
[safe_z_home]
home_xy_position: 140, 140
speed: 50
z_hop: 10
z_hop_speed: 5
[extruder]
step_pin: PC3
dir_pin: !PL6
enable_pin: !PA4
microsteps: 16
# rotation_distance: 33.500 # Original Setting, seems ??x too small
# rotation_distance: 16.75 # Initial test, seems to extrude 1/2 supposed
# rotation_distance: 8.375 # Test Two, still seems 1/2
# rotation_distance: 4.25 # Old Extruder Setup
rotation_distance: 7.9797 # Copied from Replimat
nozzle_diameter: 0.400
heater_pin: PH6
# filament_diameter: 2.850
filament_diameter: 1.750
# sensor_type: EPCOS 100K B57560G104F # Either it's not connecting right, or this is the wronf sensor
sensor_type: NTC 100K MGB18-104F39050L32 # Probably just disconnected
sensor_pin: PF0
#control: pid
#pid_Kp: 22.2
#pid_Ki: 1.08
#pid_Kd: 114
min_temp: 0
max_temp: 990
#[extruder1]
#step_pin: PC4
#dir_pin: PL7
#enable_pin: !PA3
#heater_pin: PH4
#sensor_pin: PF1
#...
[heater_bed]
heater_pin: PE5
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PF2
control: watermark
min_temp: 0
max_temp: 130
max_power: 1.0
[verify_heater heater_bed]
heating_gain: 1
check_gain_time: 60
[fan]
pin: PH3
[heater_fan heatbreak_cooling_fan]
pin: PH5
[mcu]
serial: /dev/serial/by-id/usb-UltiMachine__ultimachine.com__RAMBo_6403335373035101E171-if00
baud: 250000
[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_z_velocity: 5
max_z_accel: 100
[ad5206 stepper_digipot]
enable_pin: PD7
# Scale the config so that the channel value can be specified in amps.
# (For Rambo v1.0d boards, use 1.56 instead.)
scale: 2.08
# Channel 1 is E0, 2 is E1, 3 is unused, 4 is Z, 5 is X, 6 is Y
channel_1: 1.34
channel_2: 1.0
channel_4: 1.1
channel_5: 1.1
channel_6: 1.1
# Enable 16 micro-steps on steppers X, Y, Z, E0, E1
[static_digital_output stepper_config]
pins:
PG1, PG0,
PK7, PG2,
PK6, PK5,
PK3, PK4,
PK1, PK2
[static_digital_output yellow_led]
pins: !PB7
# Common EXP1 / EXP2 (display) pins
[board_pins]
aliases:
# Common EXP1/EXP2 headers found on RAMBo v1.4
EXP1_1=PE6, EXP1_3=PG3, EXP1_5=PJ2, EXP1_7=PJ7, EXP1_9=<GND>,
EXP1_2=PE2, EXP1_4=PG4, EXP1_6=PJ3, EXP1_8=PJ4, EXP1_10=<5V>,
# EXP2 header
EXP2_1=PB3, EXP2_3=PJ5, EXP2_5=PJ6, EXP2_7=PD4, EXP2_9=<GND>,
EXP2_2=PB1, EXP2_4=PB0, EXP2_6=PB2, EXP2_8=PE7, EXP2_10=PH2
# Pins EXP2_1, EXP2_6, EXP2_2 are also MISO, MOSI, SCK of bus "spi"
# See the sample-lcd.cfg file for definitions of common LCD displays.
[include mainsail.cfg]
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [bltouch]
#*# z_offset = 2.288
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# -1.065000, -0.857500, -0.817500, -0.865000, -0.927500
#*# -0.592500, -0.502500, -0.442500, -0.482500, -0.522500
#*# -0.172500, -0.070000, -0.027500, -0.040000, -0.057500
#*# 0.182500, 0.265000, 0.312500, 0.302500, 0.332500
#*# 0.480000, 0.610000, 0.670000, 0.715000, 0.735000
#*# x_count = 5
#*# y_count = 5
#*# mesh_x_pps = 3
#*# mesh_y_pps = 3
#*# algo = bicubic
#*# tension = 0.2
#*# min_x = 30.0
#*# max_x = 250.0
#*# min_y = 39.989999999999995
#*# max_y = 230.0
#*#
#*# [extruder]
#*# control = pid
#*# pid_kp = 23.769
#*# pid_ki = 1.248
#*# pid_kd = 113.201

View File

@ -0,0 +1,278 @@
# This file contains common pin mappings for RAMBo boards. To use this
# config, the firmware should be compiled for the AVR atmega2560.
# See docs/Config_Reference.md for a description of parameters.
[gcode_macro CALIBRATE_NOZZLE_OFFSET]
description: Move to center of bed and calibrate nozzle offset
gcode:
G90
G0 X100 Y155 F1500
PROBE_CALIBRATE
[gcode_macro LEVEL_BED]
description: "Level the bed manually."
gcode:
BED_SCREWS_ADJUST
[gcode_macro CHECK_DEVIATION]
description: "Check the deviation of the bed from the last loaded mesh."
gcode:
SCREWS_TILT_CALCULATE MAX_DEVIATION=0.05
[gcode_macro LIZ_IS_A_BAKA]
description: "Liz is a baka, so here's her start G-Code >.<"
gcode:
BED_MESH_CALIBRATE
BED_MESH_PROFILE SAVE=default
[gcode_macro _START_GCODE]
description: "The gcode that should be called from your slicer at the beginning of a print."
gcode:
# Ender 3 Custom Start G-code
G90
G1 X2 Y30 Z30 F1500
G1 Z0.28 F240
G92 E0
G1 Y220 E10 F1500 ; prime the nozzle
G1 X2.3 F5000
G92 E0
G1 Y30 E10 F1200 ; prime the nozzle
G92 E0
G1 Z5 F1500 ; don't scratch the build plate
[gcode_macro _END_GCODE]
description: "The gcode that should be called from your slicer at the end of a print."
gcode:
G91 # Relative positioning
G1 E-2 F2700 # Retract a bit
G1 E-2 Z0.2 F2400 # Retract and raise Z
G1 X5 Y5 F3000 # Wipe out
G1 Z10 # Raise Z more
G90 # Absolute positioning
G1 X0 Y220 # Present print
M106 S0 # Turn-off fan
M104 S0 # Turn-off hotend
M140 S0 # Turn-off bed
M84 X Y E # Disable all steppers but Z
[stepper_x]
step_pin: PC0
dir_pin: PL1
enable_pin: !PA7
microsteps: 16
# rotation_distance: 40 # Default, seems 3mm short on a 10mm move
# rotation_distance: 28 # Test 1, seems to move 1-2mm too far
# rotation_distance: 30 # Test 2, seems to move 1mm too far
rotation_distance: 33
endstop_pin: ^!PB6
#endstop_pin: ^PA2
position_endstop: 0
position_max: 298
homing_speed: 50
[stepper_y]
step_pin: PC1
dir_pin: !PL0
enable_pin: !PA6
microsteps: 16
# rotation_distance: 40 # Default, Seems 4mm overshot
# rotation_distance: 42 # Test 1, Still seems 3-4mm overshot
rotation_distance: 46
endstop_pin: ^!PB5
#endstop_pin: ^PA1
position_endstop: 0
position_max: 280
homing_speed: 50
[stepper_z]
step_pin: PC2
dir_pin: PL2
enable_pin: !PA5
microsteps: 16
# rotation_distance: 8 # Default, seems 1mm too short
# rotation_distance: 7.2 # Test 1, seems 3mm overshot
# rotation_distance: 8.33 # Test 2, still seems 1mm under
rotation_distance: 8
endstop_pin: probe:z_virtual_endstop
#endstop_pin: !PB4
#endstop_pin: ^PC7
# position_endstop: 0.5
position_max: 250
[bltouch]
sensor_pin: ^PB4
control_pin: PL5
x_offset: -44
y_offset: 8
#z_offset: 3.0
[bed_mesh]
speed: 120
horizontal_move_z: 7
mesh_min: 30, 40
mesh_max: 250, 230
probe_count: 5
mesh_pps: 3
algorithm: bicubic
[safe_z_home]
home_xy_position: 140, 140
speed: 50
z_hop: 10
z_hop_speed: 5
[extruder]
step_pin: PC3
dir_pin: PL6
enable_pin: !PA4
microsteps: 16
# rotation_distance: 33.500 # Original Setting, seems ??x too small
# rotation_distance: 16.75 # Initial test, seems to extrude 1/2 supposed
# rotation_distance: 8.375 # Test Two, still seems 1/2
# rotation_distance: 4.25 # Old Extruder Setup
rotation_distance: 7.9797 # Copied from Replimat
nozzle_diameter: 0.400
heater_pin: PH6
# filament_diameter: 2.850
filament_diameter: 1.750
# sensor_type: EPCOS 100K B57560G104F # Either it's not connecting right, or this is the wronf sensor
sensor_type: NTC 100K MGB18-104F39050L32 # Probably just disconnected
sensor_pin: PF0
#control: pid
#pid_Kp: 22.2
#pid_Ki: 1.08
#pid_Kd: 114
min_temp: 0
max_temp: 990
#[extruder1]
#step_pin: PC4
#dir_pin: PL7
#enable_pin: !PA3
#heater_pin: PH4
#sensor_pin: PF1
#...
[heater_bed]
heater_pin: PE5
sensor_type: EPCOS 100K B57560G104F
sensor_pin: PF2
control: watermark
min_temp: 0
max_temp: 130
max_power: 1.0
[verify_heater heater_bed]
heating_gain: 1
check_gain_time: 60
[fan]
pin: PH3
[heater_fan heatbreak_cooling_fan]
pin: PH5
fan_speed: 1.0
# The fan speed (expressed as a value from 0.0 to 1.0) that the fan
# will be set to when its associated heater is enabled. The default
# is 1.0
#max_power:
#shutdown_speed:
#cycle_time:
#hardware_pwm:
#kick_start_time:
#off_below:
#tachometer_pin:
#tachometer_ppr:
#tachometer_poll_interval:
#enable_pin:
# See the "fan" section for a description of the above parameters.
heater: extruder
# Name of the config section defining the heater that this fan is
# associated with. If a comma separated list of heater names is
# provided here, then the fan will be enabled when any of the given
# heaters are enabled. The default is "extruder".
heater_temp: 50.0
# A temperature (in Celsius) that the heater must drop below before
# the fan is disabled. The default is 50 Celsius.
[mcu]
serial: /dev/serial/by-id/usb-UltiMachine__ultimachine.com__RAMBo_6403335373035101E171-if00
baud: 250000
[printer]
kinematics: cartesian
max_velocity: 300
max_accel: 3000
max_z_velocity: 5
max_z_accel: 100
[ad5206 stepper_digipot]
enable_pin: PD7
# Scale the config so that the channel value can be specified in amps.
# (For Rambo v1.0d boards, use 1.56 instead.)
scale: 2.08
# Channel 1 is E0, 2 is E1, 3 is unused, 4 is Z, 5 is X, 6 is Y
channel_1: 1.34
channel_2: 1.0
channel_4: 1.1
channel_5: 1.1
channel_6: 1.1
# Enable 16 micro-steps on steppers X, Y, Z, E0, E1
[static_digital_output stepper_config]
pins:
PG1, PG0,
PK7, PG2,
PK6, PK5,
PK3, PK4,
PK1, PK2
[static_digital_output yellow_led]
pins: !PB7
# Common EXP1 / EXP2 (display) pins
[board_pins]
aliases:
# Common EXP1/EXP2 headers found on RAMBo v1.4
EXP1_1=PE6, EXP1_3=PG3, EXP1_5=PJ2, EXP1_7=PJ7, EXP1_9=<GND>,
EXP1_2=PE2, EXP1_4=PG4, EXP1_6=PJ3, EXP1_8=PJ4, EXP1_10=<5V>,
# EXP2 header
EXP2_1=PB3, EXP2_3=PJ5, EXP2_5=PJ6, EXP2_7=PD4, EXP2_9=<GND>,
EXP2_2=PB1, EXP2_4=PB0, EXP2_6=PB2, EXP2_8=PE7, EXP2_10=PH2
# Pins EXP2_1, EXP2_6, EXP2_2 are also MISO, MOSI, SCK of bus "spi"
# See the sample-lcd.cfg file for definitions of common LCD displays.
[include mainsail.cfg]
#*# <---------------------- SAVE_CONFIG ---------------------->
#*# DO NOT EDIT THIS BLOCK OR BELOW. The contents are auto-generated.
#*#
#*# [bltouch]
#*# z_offset = 2.850
#*#
#*# [bed_mesh default]
#*# version = 1
#*# points =
#*# -1.065000, -0.857500, -0.817500, -0.865000, -0.927500
#*# -0.592500, -0.502500, -0.442500, -0.482500, -0.522500
#*# -0.172500, -0.070000, -0.027500, -0.040000, -0.057500
#*# 0.182500, 0.265000, 0.312500, 0.302500, 0.332500
#*# 0.480000, 0.610000, 0.670000, 0.715000, 0.735000
#*# x_count = 5
#*# y_count = 5
#*# mesh_x_pps = 3
#*# mesh_y_pps = 3
#*# algo = bicubic
#*# tension = 0.2
#*# min_x = 30.0
#*# max_x = 250.0
#*# min_y = 39.989999999999995
#*# max_y = 230.0
#*#
#*# [extruder]
#*# control = pid
#*# pid_kp = 23.769
#*# pid_ki = 1.248
#*# pid_kd = 113.201

View File

@ -0,0 +1,17 @@
#### Sonar - A WiFi Keepalive daemon
####
#### Written by Stephan Wendel aka KwadFan <me@stephanwe.de>
#### Copyright 2022
#### https://github.com/mainsail-crew/sonar
####
#### This File is distributed under GPLv3
####
[sonar]
enable: false # false to disable till next reboot (will stop again if not set to true)
debug_log: false # if set to true, sonar will log ever ping with triptime and date/time
persistant_log: false # If true logs in /var/log/sonar.log, false logs to systemd
target: auto # IP Address, URL or auto as ping target
count: 3 # How often should be pinged?
interval: 60 # Ping again after X seconds
restart_treshold: 10 # If failed, restart WiFi after X seconds

Some files were not shown because too many files have changed in this diff Show More