Skip to content

Commit d74c478

Browse files
authored
feat(Happy Hare): Adds sync-feedback buffer rendering in the filament status (#1758)
Signed off by: Paul Morgan <moggieuk@hotmail.com>
1 parent a2ea72b commit d74c478

File tree

3 files changed

+186
-67
lines changed

3 files changed

+186
-67
lines changed

src/components/widgets/mmu/MmuFilamentStatus.vue

Lines changed: 181 additions & 67 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,71 @@
2020
/>
2121
</g>
2222

23+
<g
24+
id="sync-feedback-buffer-piston"
25+
fill="none"
26+
stroke-linecap="round"
27+
stroke-linejoin="round"
28+
style="stroke: var(--color-outline); fill: var(--color-outline)"
29+
>
30+
<rect
31+
x="3"
32+
y="0"
33+
width="30"
34+
height="40"
35+
rx="3"
36+
ry="3"
37+
fill="none"
38+
stroke-width="1.5"
39+
/>
40+
<path
41+
d="M-15 -4 L-6 0 L-15 4 Z"
42+
stroke-width="1"
43+
fill-opacity="0.6"
44+
/>
45+
<path
46+
d="M8 40 L 28 40"
47+
stroke-width="4"
48+
/>
49+
<text
50+
x="-22"
51+
y="4"
52+
font-size="11px"
53+
text-anchor="end"
54+
>
55+
{{ syncFeedbackPistonText }}
56+
</text>
57+
</g>
58+
59+
<g
60+
id="sync-feedback-buffer-box"
61+
fill="none"
62+
stroke-linecap="round"
63+
stroke-linejoin="round"
64+
style="stroke: var(--color-outline)"
65+
>
66+
<rect
67+
x="0"
68+
y="0"
69+
width="36"
70+
height="45"
71+
rx="3"
72+
ry="3"
73+
class="fil-background"
74+
stroke-width="2"
75+
fill-opacity="0.6"
76+
/>
77+
<path
78+
d="M-3 10 0 10 M-3 22 0.5 22 M-3 34.5 0 34.5"
79+
stroke-width="2"
80+
stroke-opacity="0.6"
81+
/>
82+
<path
83+
d="M8 0 L 28 0"
84+
stroke-width="4"
85+
/>
86+
</g>
87+
2388
<g
2489
id="sissors"
2590
style="stroke: var(--color-outline); fill: none; stroke-linecap: round; stroke-linejoin: round;"
@@ -93,19 +158,19 @@
93158
<g transform="matrix(23.2058 0 0 23.2058 329.7195 325.9517)">
94159
<path
95160
style="
96-
stroke: rgb(0, 0, 0);
97-
stroke-width: 0;
98-
stroke-dasharray: none;
99-
stroke-linecap: butt;
100-
stroke-dashoffset: 0;
101-
stroke-linejoin: miter;
102-
stroke-miterlimit: 4;
103-
is-custom-font: none;
104-
font-file-url: none;
105-
fill: rgb(254, 162, 54);
106-
fill-rule: nonzero;
107-
opacity: 1;
108-
"
161+
stroke: rgb(0, 0, 0);
162+
stroke-width: 0;
163+
stroke-dasharray: none;
164+
stroke-linecap: butt;
165+
stroke-dashoffset: 0;
166+
stroke-linejoin: miter;
167+
stroke-miterlimit: 4;
168+
is-custom-font: none;
169+
font-file-url: none;
170+
fill: rgb(254, 162, 54);
171+
fill-rule: nonzero;
172+
opacity: 1;
173+
"
109174
vector-effect="non-scaling-stroke"
110175
transform=" translate(-15.4288, -16.4198)"
111176
stroke-linecap="round"
@@ -352,56 +417,75 @@
352417
{{ temperatureText }}
353418
</text>
354419

355-
<g v-if="hasSyncFeedback && filamentPos >= FILAMENT_POS_END_BOWDEN">
356-
<transition name="fade">
357-
<g
358-
v-if="isSensorTriggered('filament_tension') && isSensorTriggered('filament_compression')"
359-
key="neutral"
360-
>
361-
<text
362-
x="288"
363-
y="240"
364-
>Neutral</text>
365-
<use
366-
xlink:href="#sync-feedback"
367-
transform="translate(286, 247.5) scale(1.0,-1.0) rotate(90)"
368-
/>
369-
</g>
370-
<g
371-
v-else-if="isSensorTriggered('filament_tension')"
372-
key="tension"
373-
>
374-
<text
375-
x="288"
376-
y="240"
377-
>Tension</text>
378-
<use
379-
xlink:href="#sync-feedback"
380-
transform="translate(258, 199) scale(1.2)"
381-
/>
382-
<use
383-
xlink:href="#sync-feedback"
384-
transform="translate(258, 271) scale(1.2,-1.2)"
385-
/>
386-
</g>
387-
<g
388-
v-else-if="isSensorTriggered('filament_compression')"
389-
key="compression"
390-
>
391-
<text
392-
x="288"
393-
y="240"
394-
>Compression</text>
395-
<use
396-
xlink:href="#sync-feedback"
397-
transform="translate(258, 235) scale(1.2)"
398-
/>
399-
<use
400-
xlink:href="#sync-feedback"
401-
transform="translate(258, 235) scale(1.2,-1.2)"
402-
/>
403-
</g>
404-
</transition>
420+
<g v-if="hasSyncFeedback">
421+
<use
422+
xlink:href="#sync-feedback-buffer-piston"
423+
:style="{
424+
transform: `translate(232px, ${syncFeedbackPistonPos}px)`,
425+
transition: 'transform 250ms ease',
426+
}"
427+
/>
428+
<use
429+
xlink:href="#sync-feedback-buffer-box"
430+
transform="translate(232, 212)"
431+
/>
432+
<g v-if="syncFeedbackActive">
433+
<transition name="fade">
434+
<g
435+
v-if="isSensorTriggered('filament_tension') && isSensorTriggered('filament_compression')"
436+
key="neutral"
437+
>
438+
<text
439+
x="298"
440+
y="240"
441+
>
442+
Neutral
443+
</text>
444+
<use
445+
xlink:href="#sync-feedback"
446+
transform="translate(296, 247.5) scale(1.0,-1.0) rotate(90)"
447+
/>
448+
</g>
449+
<g
450+
v-else-if="isSensorTriggered('filament_tension')"
451+
key="tension"
452+
>
453+
<text
454+
x="298"
455+
y="240"
456+
>
457+
Tension
458+
</text>
459+
<use
460+
xlink:href="#sync-feedback"
461+
transform="translate(272, 199) scale(1.2)"
462+
/>
463+
<use
464+
xlink:href="#sync-feedback"
465+
transform="translate(272, 271) scale(1.2,-1.2)"
466+
/>
467+
</g>
468+
<g
469+
v-else-if="isSensorTriggered('filament_compression')"
470+
key="compression"
471+
>
472+
<text
473+
x="298"
474+
y="240"
475+
>
476+
Compression
477+
</text>
478+
<use
479+
xlink:href="#sync-feedback"
480+
transform="translate(272, 235) scale(1.2)"
481+
/>
482+
<use
483+
xlink:href="#sync-feedback"
484+
transform="translate(272, 235) scale(1.2,-1.2)"
485+
/>
486+
</g>
487+
</transition>
488+
</g>
405489
</g>
406490
<text
407491
x="160"
@@ -565,7 +649,9 @@ export default class MmuFilamentStatus extends Mixins(StateMixin, MmuMixin) {
565649
}
566650
567651
get encoderPosText (): string {
568-
if (this.encoderPos < 10000) return `${this.encoderPos} mm`
652+
if (this.encoderPos < 10000) {
653+
return `${this.encoderPos} mm`
654+
}
569655
return `${this.encoderPos}`
570656
}
571657
@@ -624,9 +710,37 @@ export default class MmuFilamentStatus extends Mixins(StateMixin, MmuMixin) {
624710
}
625711
626712
get hasSyncFeedback (): boolean {
627-
return (
628-
this.syncFeedbackEnabled && (this.hasSensor('filament_compression') || this.hasSensor('filament_tension'))
629-
)
713+
return this.hasFilamentCompressionSensor || this.hasFilamentTensionSensor || this.hasFilamentProportionalSensor
714+
}
715+
716+
get syncFeedbackActive (): boolean {
717+
return this.hasSyncFeedback && this.filamentPos >= this.FILAMENT_POS_END_BOWDEN
718+
}
719+
720+
get syncFeedbackPistonPos (): number {
721+
const bias = this.syncFeedbackBiasModelled
722+
const yPos = bias * 12 + 234
723+
return yPos
724+
}
725+
726+
get syncFeedbackPistonText (): string {
727+
if (this.hasFilamentProportionalSensor) {
728+
const bias = this.syncFeedbackBiasModelled
729+
return bias.toFixed(2)
730+
}
731+
return ''
732+
}
733+
734+
get hasFilamentProportionalSensor () {
735+
return this.hasSensor('filament_proportional')
736+
}
737+
738+
get hasFilamentCompressionSensor () {
739+
return this.hasSensor('filament_compression')
740+
}
741+
742+
get hasFilamentTensionSensor () {
743+
return this.hasSensor('filament_tension')
630744
}
631745
632746
get homedToEncoder (): boolean {

src/mixins/mmu.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,10 @@ export default class MmuMixin extends Vue {
376376
return this.mmuState?.sync_feedback_enabled ?? false
377377
}
378378

379+
get syncFeedbackBiasModelled (): number {
380+
return this.mmuState?.sync_feedback_bias_modelled ?? 0
381+
}
382+
379383
get clogDetectionEnabled (): boolean {
380384
return this.mmuState?.clog_detection_enabled !== 0
381385
}

src/typings/klipper.d.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -666,6 +666,7 @@ declare namespace Klipper {
666666
sync_drive: boolean;
667667
sync_feedback_state: string;
668668
sync_feedback_enabled: boolean;
669+
sync_feedback_bias_modelled: number;
669670
clog_detection: number;
670671
clog_detection_enabled: number;
671672
endless_spool: number;

0 commit comments

Comments
 (0)