Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
70 commits
Select commit Hold shift + click to select a range
a8c9fcb
Initial (partial) port of MMU (Happy Hare) functionality
moggieuk Mar 5, 2025
57e75e4
Saving work in progress
moggieuk Mar 7, 2025
a1fb139
Functionally complete (expect hook when starting print)
moggieuk Mar 10, 2025
a95f9b8
Removed remaining to-do comments
moggieuk Mar 10, 2025
6ff6677
I think this is functionally complete
moggieuk Mar 10, 2025
ec97301
Added MMU logo option; more code cleanup
moggieuk Mar 11, 2025
6cf98d8
added 3ms logo
moggieuk Mar 11, 2025
ede7a94
slight update to stroke color in logos
moggieuk Mar 11, 2025
a6bd0b3
refinement in display of MMU logo
moggieuk Mar 12, 2025
3a867d2
Fixed logo sizing on Safari
moggieuk Mar 13, 2025
40390b8
Fixed linter errors (mostely formatting);
moggieuk Mar 13, 2025
81286ef
Merge branch 'develop' into pr/1641
pedrolamas Mar 13, 2025
fc9c1fc
Refinements on spool rack display and consistency of selection proces…
moggieuk Mar 14, 2025
0ee2826
Merge remote-tracking branch 'origin/develop' into develop
moggieuk Mar 14, 2025
b3583fc
Merge branch 'develop' into develop
pedrolamas Mar 14, 2025
d2dc093
Fixes for changes upstream
moggieuk Mar 14, 2025
9fa70bb
Merge branch 'develop' of github.com:moggieuk/fluidd-happy-hare-editi…
moggieuk Mar 14, 2025
233d588
improved highlighting of selected spool
moggieuk Mar 14, 2025
d0122a6
Added the ability to skip the server automap functionality if manuall…
moggieuk Mar 15, 2025
d3a77bc
Merge branch 'develop' into pr/1641
pedrolamas Mar 15, 2025
075f9c2
Merge branch 'develop' into pr/1641
pedrolamas Mar 15, 2025
17932fd
Fix for slight layout issue on Firefox
moggieuk Mar 16, 2025
8c8a4b3
Merge branch 'develop' of github.com:moggieuk/fluidd-happy-hare-editi…
moggieuk Mar 16, 2025
3a629e4
Fixed new linter errors after typed Vuex store change
moggieuk Mar 16, 2025
e594d8b
Merge branch 'develop' into develop
pedrolamas Mar 16, 2025
8778790
better bypass detection condition; suppress verbose log output when T…
moggieuk Mar 17, 2025
dc840ce
Merge branch 'develop' of github.com:moggieuk/fluidd-happy-hare-editi…
moggieuk Mar 17, 2025
40721f8
refactor: added mmu typings
pedrolamas Mar 16, 2025
66da2b9
style: applied Fluidd menu styling
pedrolamas Mar 16, 2025
ff4281b
refactor: move icons to global.ts
pedrolamas Mar 17, 2025
3f724e4
refactor: adds missing icons to global.ts
pedrolamas Mar 17, 2025
8dc83ae
refactor: use @Ref where possible
pedrolamas Mar 17, 2025
5848090
refactor: use inline-svg
pedrolamas Mar 17, 2025
b36b7c3
Merge branch 'develop' into develop
moggieuk Mar 18, 2025
aa8b6af
Added optional 'grip' to mmu printer object
moggieuk Mar 18, 2025
0fae176
Merge branch 'develop' into develop
pedrolamas Mar 18, 2025
2be6e96
fix: watch errors
pedrolamas Mar 18, 2025
98556da
fix: dashboard edit console error
pedrolamas Mar 18, 2025
b7a4a10
Altered defaults for printer variables.
moggieuk Mar 19, 2025
d2a7588
Merge branch 'develop' into pr/1641
pedrolamas Mar 21, 2025
1e9aef2
fix: disable if klippy not ready
pedrolamas Mar 21, 2025
70a22be
Merge branch 'develop' into pr/1641
pedrolamas Mar 21, 2025
2e5cbc8
Merge branch 'develop' into pr/1641
pedrolamas Mar 22, 2025
e21ae14
feat(mmu): disable controls if klippy not ready
pedrolamas Mar 23, 2025
85d91f9
refactor: move MmuEditTtgMapDialog to root app
pedrolamas Mar 23, 2025
e69e7fa
refactor: spoolman dialog handling
pedrolamas Mar 23, 2025
cfc10cb
refactor(mmu): dialogs bindings
pedrolamas Mar 23, 2025
3fb6838
fix(mmu): file handling
pedrolamas Mar 23, 2025
a263d3d
Bug fix - loaded/unload override not being set correctly
moggieuk Mar 24, 2025
aa05fea
fixed linter warning
moggieuk Mar 24, 2025
4224b2e
Bug Fix - handle null when material/name is cleared
moggieuk Mar 24, 2025
61f27f1
Merge branch 'develop' into pr/1641
pedrolamas Mar 24, 2025
0b0a767
Added tooltips to spools on main panel
moggieuk Mar 24, 2025
824f317
Merge branch 'develop' of github.com:moggieuk/fluidd-happy-hare-editi…
moggieuk Mar 24, 2025
8f4da07
refactor: tooltip disable condition
pedrolamas Mar 24, 2025
4958cf0
refactor: tooltip condition
pedrolamas Mar 24, 2025
367cfe5
Merge branch 'develop' into develop
pedrolamas Mar 27, 2025
beba72f
fix: allow spoolman spool id 0
pedrolamas Mar 27, 2025
4b79d17
fix: spoolman spool color
pedrolamas Mar 27, 2025
de46ec2
Minor tweaks to highlighted spool on main panel; Added missing detect…
moggieuk Mar 31, 2025
4276fc7
Merge branch 'develop' into develop
pedrolamas Apr 1, 2025
ca6ac90
feat(Mmu): allow settings reset
pedrolamas Apr 1, 2025
b7c6587
refactor: use TinyColor for luminance
pedrolamas Apr 1, 2025
1fff7d1
Show spools with filament about to run out; small improvement to the …
moggieuk Apr 6, 2025
6cb3fee
Merge branch 'develop' of github.com:moggieuk/fluidd-happy-hare-editi…
moggieuk Apr 6, 2025
30860ca
provide option to display spool color/size even if unavailable to mmu
moggieuk Apr 7, 2025
d5c29be
Change gate sensor name to Hub on multigear MMUs; corrected use of th…
moggieuk Apr 7, 2025
4c3e604
Enhancements to show empty spools; minor bugs in filament status disp…
moggieuk Apr 8, 2025
659c507
made it clear that the filament availability state should be set if i…
moggieuk Apr 10, 2025
f5d6579
Merge branch 'develop' into develop
pedrolamas Apr 21, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
578 changes: 578 additions & 0 deletions public/img/mmu/mmu_MMX.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
22 changes: 22 additions & 0 deletions src/components/settings/MmuSettings.vue
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,16 @@

<v-divider />

<app-setting :title="$t('app.mmu.setting.show_unavailable_spool_color')">
<v-switch
v-model="showUnavailableSpoolColor"
hide-details
class="mt-0 mb-4"
/>
</app-setting>

<v-divider />

<app-setting :title="$t('app.mmu.setting.show_logos')">
<v-switch
v-model="showLogos"
Expand Down Expand Up @@ -134,6 +144,18 @@ export default class MmuSettings extends Mixins(StateMixin, MmuMixin) {
})
}

get showUnavailableSpoolColor (): boolean {
return this.$typedState.config.uiSettings.mmu.showUnavailableSpoolColor
}

set showUnavailableSpoolColor (value: boolean) {
this.$typedDispatch('config/saveByPath', {
path: 'uiSettings.mmu.showUnavailableSpoolColor',
value,
server: true
})
}

get showLogos (): boolean {
return this.$typedState.config.uiSettings.mmu.showLogos
}
Expand Down
8 changes: 5 additions & 3 deletions src/components/widgets/mmu/MmuCard.vue
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,7 @@
:cols="col1Size"
class="pt-0 d-flex flex-column align-center justify-center"
>
<div class="text--disabled smaller-font min-height-text">
<div class="text--disabled smaller-font">
{{ toolchangeText }}
</div>
<div class="min-height-text">
Expand Down Expand Up @@ -359,10 +359,12 @@ export default class MmuCard extends Mixins(StateMixin, MmuMixin) {

.smaller-font {
font-size: 0.8em;
min-height: 1.0em;
line-height: 1.0em;
}

.min-height-text {
min-height: 1.2em;
line-height: 1.2em;
min-height: 1.1em;
line-height: 1.1em;
}
</style>
16 changes: 11 additions & 5 deletions src/components/widgets/mmu/MmuEditGateMapDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -213,7 +213,7 @@
>
<v-switch
v-model="selectedGateStatus"
:label="$t('app.mmu.msg.filament_available')"
:label="selectedGateStatusLabel"
hide-details
class="short-switch"
/>
Expand Down Expand Up @@ -506,11 +506,17 @@ export default class MmuEditGateMapDialog extends Mixins(BrowserMixin, StateMixi
}

set selectedGateStatus (value: boolean) {
if (value) {
this.editGateMap[this.editGateSelected].status = this.GATE_AVAILABLE
} else {
this.editGateMap[this.editGateSelected].status = this.GATE_EMPTY
this.editGateMap[this.editGateSelected].status = value ? this.GATE_AVAILABLE : this.GATE_EMPTY
}

get selectedGateStatusLabel (): string {
const status = this.editGateMap[this.editGateSelected].status
if (status === this.GATE_UNKNOWN) {
return this.$t('app.mmu.msg.filament_unknown').toString()
} else if (status === this.GATE_EMPTY) {
return this.$t('app.mmu.msg.filament_empty').toString()
}
return this.$t('app.mmu.msg.filament_available').toString()
}

handleSelectSpool () {
Expand Down
16 changes: 15 additions & 1 deletion src/components/widgets/mmu/MmuFilamentStatus.vue
Original file line number Diff line number Diff line change
Expand Up @@ -229,7 +229,7 @@
x="278"
y="115"
:class="{ 'text-disabled': !isSensorEnabled('mmu_gate') }"
>Gate</text>
>{{ gateSensorName }}</text>
<transition name="fade">
<text
v-if="homedToGate"
Expand Down Expand Up @@ -526,6 +526,13 @@ export default class MmuFilamentStatus extends Mixins(StateMixin, MmuMixin) {

case this.FILAMENT_POS_IN_EXTRUDER:
pos = this.POSITIONS['cooling-tube']
if (
this.hasSensor('toolhead') &&
this.isSensorEnabled('toolhead') &&
!this.isSensorTriggered('toolhead')
) {
pos = this.POSITIONS['before-toolhead'] // Don't show beyond toolhead sensor if not triggered
}
break

case this.FILAMENT_POS_LOADED:
Expand Down Expand Up @@ -658,6 +665,13 @@ export default class MmuFilamentStatus extends Mixins(StateMixin, MmuMixin) {
return `${this.encoderPos}`
}

get gateSensorName (): string {
if (this.unitDetails(this.unit).multiGear) {
return 'Hub (Gate)'
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ideally (and unless I am missing something here), these should be localized strings!

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Well, possibly, but those terms are used in config and throughout doc to reference a sensor name. I think it would be confusing to have translated sensor names... The "Hub" was and add-on to help the Box Turtle and other type-B MMU's who all refer to the "gate" sensor as a "hub" sensor.

}
return 'Gate'
}

get temperatureClass (): string {
const canExtrude = this.$typedState.printer.printer.extruder?.can_extrude ?? false
if (canExtrude === false) return 'text-disabled'
Expand Down
2 changes: 1 addition & 1 deletion src/components/widgets/mmu/MmuMachine.vue
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
>
<div :class="$vuetify.theme.dark ? 'mmu-unit mmu-unit-dark-theme' : 'mmu-unit mmu-unit-light-theme'">
<mmu-unit
:unit="index"
:unit-index="index"
:edit-gate-map="editGateMap"
:edit-gate-selected="editGateSelected"
@select-gate="selectGate"
Expand Down
6 changes: 3 additions & 3 deletions src/components/widgets/mmu/MmuMaintenanceDialog.vue
Original file line number Diff line number Diff line change
Expand Up @@ -514,9 +514,9 @@ export default class MmuMaintainanceStateDialog extends Mixins(BrowserMixin, Sta
return this.$typedState.printer.printer.mmu_leds?.led_effect_module ?? false
}

private unitDisplayName (unit: number): string {
const name = this.unitDetails(unit).name
return `MMU #${unit + 1} - ${name}`
private unitDisplayName (unitIndex: number): string {
const name = this.unitDetails(unitIndex).name
return `MMU #${unitIndex + 1} - ${name}`
}

private updateLeds () {
Expand Down
23 changes: 23 additions & 0 deletions src/components/widgets/mmu/MmuSettings.vue
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,17 @@
</v-list-item-content>
</v-list-item>

<v-list-item @click="showUnavailableSpoolColor = !showUnavailableSpoolColor">
<v-list-item-action class="my-0">
<v-checkbox :input-value="showUnavailableSpoolColor" />
</v-list-item-action>
<v-list-item-content>
<v-list-item-title>
{{ $t('app.mmu.setting.show_unavailable_spool_color') }}
</v-list-item-title>
</v-list-item-content>
</v-list-item>

<v-list-item @click="showLogos = !showLogos">
<v-list-item-action class="my-0">
<v-checkbox :input-value="showLogos" />
Expand Down Expand Up @@ -135,6 +146,18 @@ export default class MmuSettings extends Mixins(StateMixin, MmuMixin) {
})
}

get showUnavailableSpoolColor (): boolean {
return this.$typedState.config.uiSettings.mmu.showUnavailableSpoolColor
}

set showUnavailableSpoolColor (value: boolean) {
this.$typedDispatch('config/saveByPath', {
path: 'uiSettings.mmu.showUnavailableSpoolColor',
value,
server: true
})
}

get showLogos (): boolean {
return this.$typedState.config.uiSettings.mmu.showLogos
}
Expand Down
15 changes: 8 additions & 7 deletions src/components/widgets/mmu/MmuSpool.vue
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@
/>
</g>
<path
v-if="filamentAmount !== 0"
v-if="filamentAmount !== 0 || details.status !== GATE_EMPTY"
ref="filament"
d="M 0 -63 C 35 -63 63 -35 63 0 C 63 35 35 63 0 63 L -424 63 L -424 -63 z"
vector-effect="non-scaling-stroke"
Expand All @@ -93,7 +93,7 @@

<g v-if="!editGateMap">
<text
v-if="showPercent && filamentAmount > 0"
v-if="filamentAmount > 0"
x="152"
y="270"
text-anchor="middle"
Expand All @@ -104,7 +104,7 @@
{{ filamentAmount }}%
</text>
<text
v-else-if="!showPercent && filamentAmount === 0"
v-else-if="filamentAmount === 0 && details.status !== GATE_EMPTY"
x="140"
y="310"
text-anchor="middle"
Expand Down Expand Up @@ -144,9 +144,6 @@ export default class MmuSpool extends Mixins(StateMixin, MmuMixin) {
@Prop({ required: false, default: '#AD8762' })
readonly spoolWheelColor!: string

@Prop({ required: false, default: true })
readonly showPercent!: boolean

@Prop({ required: false, default: null })
readonly editGateMap!: MmuGateDetails[] | null

Expand All @@ -161,9 +158,13 @@ export default class MmuSpool extends Mixins(StateMixin, MmuMixin) {
return this.gateDetails(this.gateIndex)
}

get showUnavailableSpoolColor (): boolean {
return this.$typedState.config.uiSettings.mmu.showUnavailableSpoolColor
}

get filamentAmount (): number {
if (this.editGateMap) return 100
if (this.details.status === this.GATE_EMPTY) return 0
if (this.details.status === this.GATE_EMPTY && !(this.showUnavailableSpoolColor && this.details.color !== this.NO_FILAMENT_COLOR)) return 0

const spoolmanSpool = this.spoolmanSpool(this.details.spoolId)
if (!spoolmanSpool) return -1
Expand Down
10 changes: 5 additions & 5 deletions src/components/widgets/mmu/MmuUnit.vue
Original file line number Diff line number Diff line change
Expand Up @@ -199,7 +199,7 @@ import MmuGateStatus from '@/components/widgets/mmu/MmuGateStatus.vue'
})
export default class MmuUnit extends Mixins(BrowserMixin, StateMixin, MmuMixin) {
@Prop({ required: false, default: 0 })
readonly unit!: number
readonly unitIndex!: number

@Prop({ required: false, default: null })
readonly editGateMap!: MmuGateDetails[] | null
Expand All @@ -219,12 +219,12 @@ export default class MmuUnit extends Mixins(BrowserMixin, StateMixin, MmuMixin)
}

get unitDisplayName (): string {
const name = this.unitDetails(this.unit).name
return `#${this.unit + 1} ${name}`
const name = this.unitDetails(this.unitIndex).name
return `#${this.unitIndex + 1} ${name}`
}

get unitGateRange (): number[] {
const unitDetails = this.unitDetails(this.unit)
const unitDetails = this.unitDetails(this.unitIndex)
return Array.from({ length: unitDetails.numGates }, (v, k) => k + unitDetails.firstGate)
}

Expand Down Expand Up @@ -262,7 +262,7 @@ export default class MmuUnit extends Mixins(BrowserMixin, StateMixin, MmuMixin)
}

get showBypass (): boolean {
return !this.editGateMap && this.unitDetails(this.unit).hasBypass && this.hasBypass
return !this.editGateMap && this.unitDetails(this.unitIndex).hasBypass && this.hasBypass
}

gateTooltip (gate: number): string[] {
Expand Down
3 changes: 3 additions & 0 deletions src/locales/en.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -1078,6 +1078,8 @@ app:
are_you_sure: Are you sure?
bad_temperature: Temperature out of range
filament_available: Filament available in gate
filament_unknown: Unknown filament state (please set)
filament_empty: Filament not available
maintenance_intro: Directly manage specific MMU functions and selective configuration.
recover_intro: This is a low level recovery for use when Happy Hare is out of sync with your MMU. It is recommended to try automatic recovery first however this will be required to correct the current tool or gate (Alternatively on Type-A MMU's you can unload and home the selector).
no_custom_controls: No Custom Controls
Expand Down Expand Up @@ -1112,6 +1114,7 @@ app:
show_details: Show Filament Details
show_ttg_map: Show TTG Map
show_logos: Show Logos
show_unavailable_spool_color: Show Unavailable Spools
sensors:
title:
sensors: Sensors
Expand Down
6 changes: 6 additions & 0 deletions src/mixins/mmu.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,6 +111,12 @@ export default class MmuMixin extends Vue {
return this.mmuState?.is_homed ?? false
}

get unit (): number {
return this.mmuState?.unit ?? this.UNIT_UNKNOWN
}

readonly UNIT_UNKNOWN: number = -1

get gate (): number {
return this.mmuState?.gate ?? this.TOOL_GATE_UNKNOWN
}
Expand Down
3 changes: 2 additions & 1 deletion src/store/config/state.ts
Original file line number Diff line number Diff line change
Expand Up @@ -148,7 +148,8 @@ export const defaultState = (): ConfigState => {
showTtgMap: true,
showDetails: true,
largeFilamentStatus: false,
showLogos: false
showLogos: false,
showUnavailableSpoolColor: false
}
}
}
Expand Down
1 change: 1 addition & 0 deletions src/store/config/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -60,6 +60,7 @@ export interface MmuConfig {
showDetails: boolean;
largeFilamentStatus: boolean;
showLogos: boolean;
showUnavailableSpoolColor: boolean;
}

export interface HostConfig {
Expand Down