Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Armored Turtle AFC #2089

Open
wants to merge 66 commits into
base: develop
Choose a base branch
from
Open
Changes from 1 commit
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
559f5a1
Add files via upload
MG-longshot Dec 14, 2024
1dca380
Add files via upload
MG-longshot Dec 14, 2024
7795d22
Add files via upload
MG-longshot Dec 14, 2024
f95f074
brought to current mainsail
MG-longshot Dec 14, 2024
c4a4e17
Update AfcPanel.vue
MG-longshot Dec 14, 2024
610ef22
changed scaling and position of spool cards
MG-longshot Dec 15, 2024
9454a4b
fixed spool div size
MG-longshot Dec 15, 2024
72ce6e7
added pointer to reel
MG-longshot Dec 15, 2024
26909ac
new spool svg
MG-longshot Dec 15, 2024
c47a467
Update BoxTurtleIcon.vue
MG-longshot Dec 15, 2024
45c2974
Updated SpoolDialog to handle manual filament assignment if spoolman …
Wondro Dec 17, 2024
7e00a06
Merge pull request #5 from Wondro/develop
MG-longshot Dec 17, 2024
540f72f
Merge branch 'mainsail-crew:develop' into develop
MG-longshot Dec 28, 2024
e7d4cfe
Added lang vars
Wondro Dec 28, 2024
28119b7
Merge pull request #6 from Wondro/develop
MG-longshot Dec 28, 2024
976a756
Format cleanup
Wondro Dec 29, 2024
cddc674
refactor: Cleaned format layout and converted base AfcUnit to use ser…
Wondro Dec 29, 2024
fb78a2b
Remove un-needed padding
Wondro Dec 29, 2024
84b026b
Merge branch 'ArmoredTurtle:develop' into develop
Wondro Dec 29, 2024
cf45084
Merge pull request #7 from Wondro/develop
MG-longshot Dec 29, 2024
693929b
feat: Enhance lane actions, spool management, and extruder tools func…
Wondro Dec 31, 2024
e60bb84
Merge branch 'develop' of https://github.com/Wondro/mainsail-AFC into…
Wondro Dec 31, 2024
84d4a3e
Merge branch 'ArmoredTurtle:develop' into develop
Wondro Dec 31, 2024
dd8a1fb
Merge pull request #8 from Wondro/develop
MG-longshot Jan 1, 2025
9037cda
feat: Enhance AFC panel and spool management
Wondro Jan 5, 2025
1ee82bb
Merge branch 'develop' of https://github.com/Wondro/mainsail-AFC into…
Wondro Jan 5, 2025
7ef5966
Fix: Spool Icon scale issue and infinite spool list map
Wondro Jan 5, 2025
99bfcc7
feat: Changed the park and wipe macro setting to pull the macro defin…
Wondro Jan 6, 2025
b983e84
feat: update fetchAFCData to handle new printer data format
Wondro Jan 7, 2025
4d46464
feat: Added Unit Icon Toggle
Wondro Jan 7, 2025
d41079b
Merge remote-tracking branch 'origin/develop' into develop-DEV
Wondro Jan 7, 2025
e736c83
Merge pull request #9 from Wondro/develop
MG-longshot Jan 7, 2025
ad539ad
feat: Update afc data parse to new format
Wondro Jan 8, 2025
47c23f5
Merge remote-tracking branch 'origin/develop' into develop-DEV
Wondro Jan 8, 2025
a6129d1
feat: enhance spool management and UI improvements
Wondro Jan 11, 2025
acf5c7a
Clean up
Wondro Jan 11, 2025
b911e4a
feat: enhance AFC data processing and UI improvements
Wondro Jan 12, 2025
38b7d81
Remove unused buffer var from extruder type
Wondro Jan 12, 2025
4e50c82
Small cleanup to missed var check
Wondro Jan 12, 2025
3be37d2
Changed Lane Eject to still be an option when late is preped but not …
Wondro Jan 14, 2025
d547254
Add support for cailibration macro
Wondro Jan 16, 2025
a0fabd7
Disable calibrate if printing
Wondro Jan 22, 2025
3f3221c
Adjusted extruder to show loaded lane even if they arent the active t…
Wondro Jan 22, 2025
eef8d94
Merge pull request #10 from Wondro/develop
MG-longshot Jan 25, 2025
439bb6b
Merge branch 'mainsail-crew:develop' into develop
MG-longshot Feb 19, 2025
1bc7ee0
Merge branch 'mainsail-crew:develop' into develop
MG-longshot Feb 28, 2025
aebe8fd
Rebase server code to SFC
Wondro Feb 28, 2025
114b3bb
Merge branch 'develop' of https://github.com/Wondro/mainsail-AFC into…
Wondro Feb 28, 2025
cc35ae6
Cleanup
Wondro Feb 28, 2025
b789135
Add bypass state detection
Wondro Feb 28, 2025
fe67334
Auto-Collapse AFC components when bypass is enabled
Wondro Feb 28, 2025
da1f1b9
Merge pull request #11 from Wondro/develop
MG-longshot Feb 28, 2025
80806b3
Added Indicator Led on/off toggle
Wondro Mar 1, 2025
54df882
Changed unit icons to not use built in ui elements.
Wondro Mar 1, 2025
ed143a6
prettier
Wondro Mar 1, 2025
8910932
Merge branch 'ArmoredTurtle:develop' into develop
Wondro Mar 1, 2025
fc6bd18
Clean unused locale keys
Wondro Mar 1, 2025
826bea5
Merge branch 'develop' of https://github.com/Wondro/mainsail-AFC into…
Wondro Mar 1, 2025
890ae35
Fix AFC data update to properly update when not on dashboard.
Wondro Mar 2, 2025
a9ee1f1
Revert "Clean unused locale keys"
Wondro Mar 2, 2025
20f1029
Added AFC log to download log options
Wondro Mar 2, 2025
7b97ccd
Added indicator to spool select list to show which lanes a spool is l…
Wondro Mar 2, 2025
501c666
Merge pull request #12 from Wondro/develop
MG-longshot Mar 2, 2025
e5c58d2
Rework start print and gcode files panel to new color preview layout
Wondro Mar 3, 2025
4c723d4
Merge branch 'develop' of https://github.com/Wondro/mainsail-AFC into…
Wondro Mar 3, 2025
f27fb7e
Merge pull request #13 from Wondro/develop
MG-longshot Mar 3, 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
Prev Previous commit
Next Next commit
Changed Lane Eject to still be an option when late is preped but not …
…loaded

Catch edge case where unit data is not parsed correctly and display an error.
Wondro committed Jan 14, 2025
commit 3be37d291d967cc1b5ae234181d91755ee115505
7 changes: 6 additions & 1 deletion src/components/panels/Afc/AfcExtruderToolsItem.vue
Original file line number Diff line number Diff line change
@@ -65,9 +65,10 @@ import Component from 'vue-class-component'
import { Mixins, Prop } from 'vue-property-decorator'
import BaseMixin from '@/components/mixins/base'
import { Extruder, Lane } from '@/store/server/afc/types'
import ControlMixin from '@/components/mixins/control'

@Component({})
export default class AfcExtruderToolsItem extends Mixins(BaseMixin) {
export default class AfcExtruderToolsItem extends Mixins(BaseMixin, ControlMixin) {
@Prop({ type: Object, required: true }) readonly tool!: Extruder

get currentLane(): Lane {
@@ -107,6 +108,10 @@ export default class AfcExtruderToolsItem extends Mixins(BaseMixin) {
buffer = `${this.currentLane.buffer.name}: ${this.currentLane.buffer.state}`
}

if (this.printerIsPrintingOnly) {
state = `${this.$t('Panels.AfcPanel.Printing')}`
}

return { state, lane, buffer }
}

8 changes: 6 additions & 2 deletions src/components/panels/Afc/AfcUnitsItemLane.vue
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
<template>
<div>
<div class="spool-card-header">
<v-menu v-if="laneReady" :offset-y="true" :close-on-content-click="true" left>
<v-menu v-if="lanePrep" :offset-y="true" :close-on-content-click="true" left>
<template #activator="{ on: onMenu, attrs }">
<v-tooltip top>
<template #activator="{ on: onTooltip }">
@@ -17,7 +17,7 @@
<template #activator="{ on: onExtruderTemp }">
<div v-on="onExtruderTemp">
<v-list-item
v-if="!toolLoaded"
v-if="!toolLoaded && laneReady"
:disabled="
(!extrudePossible && lane.spool.material === '') || printerIsPrintingOnly
"
@@ -105,6 +105,10 @@ export default class AfcUnits extends Mixins(BaseMixin, ExtruderMixin) {
return this.lane.load && this.lane.prep
}

get lanePrep() {
return this.lane.prep
}

get toolLoaded() {
return this.lane.tool_loaded
}
180 changes: 100 additions & 80 deletions src/components/panels/AfcPanel.vue
Original file line number Diff line number Diff line change
@@ -1,84 +1,95 @@
<template>
<panel
v-if="showPanel"
:title="$t('Panels.AfcPanel.Headline')"
:collapsible="true"
:expanded="true"
card-class="afc-control-panel">
<template #title>
<span>{{ $t('Panels.AfcPanel.Headline') }}</span>
</template>
<template #icon>
<AFCLogo class="panel-icon" />
</template>
<template #buttons>
<v-menu v-if="showAfcMacros" :offset-y="true" :close-on-content-click="false" left>
<template #activator="{ on, attrs }">
<v-btn icon tile v-bind="attrs" v-on="on">
<v-icon>{{ mdiDotsVertical }}</v-icon>
</v-btn>
</template>
<v-list dense>
<!-- NOZZLE CLEAN -->
<v-list-item v-if="brushMacroEnabled">
<macro-button
:macro="afcBrushMacro"
:alias="$t('Panels.AfcPanel.BrushNozzle')"
:disabled="printerIsPrintingOnly"
color="#272727" />
</v-list-item>
<!-- PARK NOZZLE -->
<v-list-item v-if="parkMacroEnabled">
<macro-button
:macro="afcParkMacro"
:alias="$t('Panels.AfcPanel.ParkNozzle')"
:disabled="printerIsPrintingOnly"
color="#272727" />
</v-list-item>
</v-list>
</v-menu>
<afc-panel-settings :units="unitsData" />
</template>
<template v-if="display_message.message !== ''">
<v-container>
<v-row class="flex-nowrap">
<v-col class="py-2" style="min-width: 0">
<span :class="`${messageType.color}--text subtitle-2 px-0`">
<v-icon class="mr-2 mt-1 float-left" :color="messageType.color" small>
{{ messageType.icon }}
<div>
<panel
v-if="showPanel"
:title="$t('Panels.AfcPanel.Headline')"
:collapsible="true"
:expanded="true"
card-class="afc-control-panel">
<template #title>
<span>{{ $t('Panels.AfcPanel.Headline') }}</span>
</template>
<template #icon>
<AFCLogo class="panel-icon" />
</template>
<template #buttons>
<v-btn v-if="showAFC" icon tile :title="`Calibrate AFC`" @click="calibrateAFC">
<v-icon small>{{ mdiWrench }}</v-icon>
</v-btn>
<v-menu v-if="showAfcMacros && showAFC" :offset-y="true" :close-on-content-click="false" left>
<template #activator="{ on, attrs }">
<v-btn icon tile v-bind="attrs" v-on="on">
<v-icon>{{ mdiDotsVertical }}</v-icon>
</v-btn>
</template>
<v-list dense>
<!-- NOZZLE CLEAN -->
<v-list-item v-if="brushMacroEnabled">
<macro-button
:macro="afcBrushMacro"
:alias="$t('Panels.AfcPanel.BrushNozzle')"
:disabled="printerIsPrintingOnly"
color="#272727" />
</v-list-item>
<!-- PARK NOZZLE -->
<v-list-item v-if="parkMacroEnabled">
<macro-button
:macro="afcParkMacro"
:alias="$t('Panels.AfcPanel.ParkNozzle')"
:disabled="printerIsPrintingOnly"
color="#272727" />
</v-list-item>
</v-list>
</v-menu>
<afc-panel-settings v-if="showAFC" :units="unitsData" />
</template>
<template v-if="display_message.message !== ''">
<v-container>
<v-row class="flex-nowrap">
<v-col class="py-2" style="min-width: 0">
<span :class="`${messageType.color}--text subtitle-2 px-0`">
<v-icon class="mr-2 mt-1 float-left" :color="messageType.color" small>
{{ messageType.icon }}
</v-icon>
{{ display_message.message }}
</span>
</v-col>
<v-col class="col-auto py-2">
<v-icon class="text--disabled cursor-pointer" small @click="clearDisplayMessage">
{{ mdiCloseCircle }}
</v-icon>
{{ display_message.message }}
</span>
</v-col>
<v-col class="col-auto py-2">
<v-icon class="text--disabled cursor-pointer" small @click="clearDisplayMessage">
{{ mdiCloseCircle }}
</v-icon>
</v-col>
</v-row>
</v-container>
<v-divider class="mt-0 mb-0" />
</template>
<v-expansion-panels v-model="toolExpandedIndex">
<v-expansion-panel>
<v-expansion-panel-header>
<strong>
{{ $t('Panels.AfcPanel.ExtruderTools') }}
<span v-if="toolExpandedIndex !== 0" class="text-caption text--disabled pl-1">
( {{ toolCount }} )
</span>
</strong>
</v-expansion-panel-header>
<v-expansion-panel-content>
<afc-extruder-tools :tools="toolData" />
</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>

<v-expansion-panels v-model="unitExpandedIndex" multiple>
<afc-units :units="unitsData" />
</v-expansion-panels>
</panel>
</v-col>
</v-row>
</v-container>
<v-divider class="mt-0 mb-0" />
</template>
<div v-if="showAFC">
<v-expansion-panels v-model="toolExpandedIndex">
<v-expansion-panel>
<v-expansion-panel-header>
<strong>
{{ $t('Panels.AfcPanel.ExtruderTools') }}
<span v-if="toolExpandedIndex !== 0" class="text-caption text--disabled pl-1">
( {{ toolCount }} )
</span>
</strong>
</v-expansion-panel-header>
<v-expansion-panel-content>
<afc-extruder-tools :tools="toolData" />
</v-expansion-panel-content>
</v-expansion-panel>
</v-expansion-panels>

<v-expansion-panels v-model="unitExpandedIndex" multiple>
<afc-units :units="unitsData" />
</v-expansion-panels>
</div>
<div v-else>
<v-card-text class="text-center error--text py-10">{{ $t('Panels.AfcPanel.LoadError') }}</v-card-text>
</div>
</panel>
<afc-calibrate-dialog :show-dialog="showCalibrateDialog" @close="showCalibrateDialog = false" />
</div>
</template>

<script lang="ts">
@@ -88,7 +99,7 @@ import ControlMixin from '@/components/mixins/control'
import { PrinterStateMacro } from '@/store/printer/types'
import Panel from '@/components/ui/Panel.vue'
import AFCLogo from '@/components/ui/AFCLogo.vue'
import { mdiDotsVertical, mdiCloseCircle, mdiMessageProcessingOutline, mdiAlertOutline } from '@mdi/js'
import { mdiDotsVertical, mdiCloseCircle, mdiMessageProcessingOutline, mdiAlertOutline, mdiWrench } from '@mdi/js'
import { Extruder, Unit, Message } from '@/store/server/afc/types'

@Component({
@@ -100,6 +111,7 @@ import { Extruder, Unit, Message } from '@/store/server/afc/types'
export default class AfcPanel extends Mixins(BaseMixin, ControlMixin) {
mdiDotsVertical = mdiDotsVertical
mdiCloseCircle = mdiCloseCircle
mdiWrench = mdiWrench

intervalId: ReturnType<typeof setInterval> | null = null
toolExpandedIndex: number | null = null
@@ -108,6 +120,12 @@ export default class AfcPanel extends Mixins(BaseMixin, ControlMixin) {
display_message: Message = { message: '', type: '' }
old_message: Message = { message: '', type: '' }

showCalibrateDialog = false

get showAFC(): boolean {
return this.unitsData.length > 0
}

get showPanel(): boolean {
return this.klipperReadyForGui /* && Check if AFC is initialized */
}
@@ -172,6 +190,8 @@ export default class AfcPanel extends Mixins(BaseMixin, ControlMixin) {
}
}

calibrateAFC() {}

clearDisplayMessage() {
this.old_message = this.display_message
this.display_message = { message: '', type: '' }
15 changes: 15 additions & 0 deletions src/locales/en.json
Original file line number Diff line number Diff line change
@@ -608,6 +608,19 @@
"Headline": "Manual Probe"
},
"Panels": {
"AfcCalibratePanel": {
"AllLanes": "All Lanes",
"Back": "Back",
"BowdenLength": "Bowden Length",
"Calibrate": "Calibrate",
"CalibrateBowdenLength": "Calibrate Bowden Length",
"CalibrateLanes": "Calibrate Lanes",
"CalibrateOption": "Please select from the list of available calibration options.",
"Lanes": "Lanes",
"Search": "Search",
"UnitName": "Name",
"UnitType": "Type"
},
"AfcPanel": {
"BrushNozzle": "Brush Nozzle",
"BufferDisabled": "Buffer Not Active",
@@ -631,12 +644,14 @@
"LaneLoadedNone": "NONE",
"LaneMap": "Remap current lane to selected T command",
"Load": "Load Lane",
"LoadError": "There was an issue loading unit information. Please check your configurations and make sure you are on the latest version of AFC.",
"Loading": "Loading",
"Moving": "Moving",
"OpenSpoolInfo": "Open Spool Info",
"ParkNozzle": "Park Nozzle",
"PostExtruderSensor": "Post-Extruder Sensor",
"PreExtruderSensor": "Pre-Extruder Sensor",
"Printing": "Printing",
"RammingSensor": "Ramming Sensor",
"Restoring": "Restoring",
"ShowInfiniteSpool": "Infinite Spool",
16 changes: 8 additions & 8 deletions src/store/server/afc/actions.ts
Original file line number Diff line number Diff line change
@@ -23,7 +23,7 @@ export const actions: ActionTree<AFCState, RootState> = {
const hubs: Hub[] = []
const lanes: Lane[] = []

afcData.buffers.forEach((bufferName: string) => {
afcData.buffers?.forEach((bufferName: string) => {
const bufferData: any = printer[`AFC_buffer ${bufferName}`]
if (bufferData) {
const buffer: FilBuffer = {
@@ -35,7 +35,7 @@ export const actions: ActionTree<AFCState, RootState> = {
}
})

afcData.hubs.forEach((hubName: string) => {
afcData.hubs?.forEach((hubName: string) => {
const hubData: any = printer[`AFC_hub ${hubName}`]
if (hubData) {
const hub: Hub = {
@@ -49,7 +49,7 @@ export const actions: ActionTree<AFCState, RootState> = {
})

// Process extruders
afcData.extruders.forEach((extruderName: string) => {
afcData.extruders?.forEach((extruderName: string) => {
const extruderData: any = printer[`AFC_extruder ${extruderName}`]
if (!extruderData) {
console.error(`Missing extruder data for: ${extruderName}`)
@@ -70,7 +70,7 @@ export const actions: ActionTree<AFCState, RootState> = {
})

// Process units
afcData.units.forEach((unitEntry: string) => {
afcData.units?.forEach((unitEntry: string) => {
const [type, name]: [string, string] = unitEntry.split(' ') as [string, string]
if (!type || !name) {
console.error(`Invalid unit entry: ${unitEntry}`)
@@ -93,21 +93,21 @@ export const actions: ActionTree<AFCState, RootState> = {
buffers: [],
}

unitData.hubs.forEach((hubName: string) => {
unitData.hubs?.forEach((hubName: string) => {
const hub = hubs.find((h) => h.name === hubName)
if (hub) {
unit.hubs.push(hub)
}
})

unitData.extruders.forEach((extruderName: string) => {
unitData.extruders?.forEach((extruderName: string) => {
const extruder = extruders.find((e) => e.name === extruderName)
if (extruder) {
unit.extruders.push(extruder)
}
})

unitData.buffers.forEach((bufferName: string) => {
unitData.buffers?.forEach((bufferName: string) => {
const buffer = buffers.find((b) => b.name === bufferName)
if (buffer) {
unit.buffers.push(buffer)
@@ -118,7 +118,7 @@ export const actions: ActionTree<AFCState, RootState> = {
})

// Process lanes
afcData.lanes.forEach((laneName: string) => {
afcData.lanes?.forEach((laneName: string) => {
const laneData: any = printer[`AFC_stepper ${laneName}`]
if (!laneData) {
console.error(`Missing lane data for: ${laneName}`)