feature: add webcam support to printer farm
Signed-off-by: Stefan Dej <meteyou@gmail.com>
This commit is contained in:
parent
88afe071e1
commit
c17951b53d
@ -3,6 +3,22 @@
|
|||||||
opacity: 0.6;
|
opacity: 0.6;
|
||||||
filter: grayscale(70%);
|
filter: grayscale(70%);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.webcamContainer,
|
||||||
|
.webcamContainer .vue-load-image,
|
||||||
|
.webcamContainer>div,
|
||||||
|
.webcamContainer img {
|
||||||
|
position: absolute !important;
|
||||||
|
top: 0; left: 0; right: 0; bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.webcamContainer img {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.webcamContainer .webcamFpsOutput {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
@ -15,12 +31,49 @@
|
|||||||
<v-toolbar-title>
|
<v-toolbar-title>
|
||||||
<span class="subheading"><v-icon left>mdi-printer-3d</v-icon>{{ printer_name }}</span>
|
<span class="subheading"><v-icon left>mdi-printer-3d</v-icon>{{ printer_name }}</span>
|
||||||
</v-toolbar-title>
|
</v-toolbar-title>
|
||||||
|
<v-spacer></v-spacer>
|
||||||
|
<v-item-group v-if="this.printer_webcams.length">
|
||||||
|
<v-menu :offset-y="true" title="Webcam">
|
||||||
|
<template v-slot:activator="{ on, attrs }">
|
||||||
|
<v-btn small class="px-2 minwidth-0" color="grey darken-3" v-bind="attrs" v-on="on">
|
||||||
|
<v-icon small>mdi-webcam</v-icon>
|
||||||
|
<v-icon small>mdi-menu-down</v-icon>
|
||||||
|
</v-btn>
|
||||||
|
</template>
|
||||||
|
<v-list dense class="py-0">
|
||||||
|
<v-list-item link @click="currentCamName = 'off'">
|
||||||
|
<v-list-item-icon class="mr-0">
|
||||||
|
<v-icon small>mdi-webcam-off</v-icon>
|
||||||
|
</v-list-item-icon>
|
||||||
|
<v-list-item-content>
|
||||||
|
<v-list-item-title>{{ $t('Panels.FarmPrinterPanel.WebcamOff') }}</v-list-item-title>
|
||||||
|
</v-list-item-content>
|
||||||
|
</v-list-item>
|
||||||
|
<v-list-item v-for="webcam of this.printer_webcams" v-bind:key="webcam.index" link @click="currentCamName = webcam.name">
|
||||||
|
<v-list-item-icon class="mr-0">
|
||||||
|
<v-icon small>{{ webcam.icon }}</v-icon>
|
||||||
|
</v-list-item-icon>
|
||||||
|
<v-list-item-content>
|
||||||
|
<v-list-item-title v-text="webcam.name"></v-list-item-title>
|
||||||
|
</v-list-item-content>
|
||||||
|
</v-list-item>
|
||||||
|
</v-list>
|
||||||
|
</v-menu>
|
||||||
|
</v-item-group>
|
||||||
</v-toolbar>
|
</v-toolbar>
|
||||||
<v-img
|
<v-img
|
||||||
height="200px"
|
height="200px"
|
||||||
:src="printer_image"
|
:src="printer_image"
|
||||||
class="d-flex align-end"
|
class="d-flex align-end"
|
||||||
>
|
>
|
||||||
|
<div v-if="currentCamName !== 'off' && currentWebcam" class="webcamContainer">
|
||||||
|
<template v-if="'service' in currentWebcam && currentWebcam.service === 'mjpegstreamer'">
|
||||||
|
<webcam-mjpegstreamer :cam-settings="currentWebcam"></webcam-mjpegstreamer>
|
||||||
|
</template>
|
||||||
|
<template v-if="'service' in currentWebcam && currentWebcam.service === 'mjpegstreamer-adaptive'">
|
||||||
|
<webcam-mjpegstreamer-adaptive :cam-settings="currentWebcam"></webcam-mjpegstreamer-adaptive>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
<v-card-title class="white--text py-2" style="background-color: rgba(0,0,0,0.3); backdrop-filter: blur(3px);">
|
<v-card-title class="white--text py-2" style="background-color: rgba(0,0,0,0.3); backdrop-filter: blur(3px);">
|
||||||
<v-row>
|
<v-row>
|
||||||
<v-col class="col-auto pr-0 d-flex align-center" style="width: 58px">
|
<v-col class="col-auto pr-0 d-flex align-center" style="width: 58px">
|
||||||
@ -48,10 +101,18 @@
|
|||||||
|
|
||||||
<script>
|
<script>
|
||||||
import { mapState } from 'vuex'
|
import { mapState } from 'vuex'
|
||||||
|
import Mjpegstreamer from "@/components/webcams/Mjpegstreamer"
|
||||||
|
import MjpegstreamerAdaptive from "@/components/webcams/MjpegstreamerAdaptive"
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
components: {
|
components: {
|
||||||
|
"webcam-mjpegstreamer": Mjpegstreamer,
|
||||||
|
"webcam-mjpegstreamer-adaptive": MjpegstreamerAdaptive,
|
||||||
|
},
|
||||||
|
data: function() {
|
||||||
|
return {
|
||||||
|
currentCamName: "off",
|
||||||
|
}
|
||||||
},
|
},
|
||||||
props: {
|
props: {
|
||||||
printer: {
|
printer: {
|
||||||
@ -102,6 +163,19 @@
|
|||||||
get() {
|
get() {
|
||||||
return this.$store.getters["farm/"+this.printer._namespace+"/getPrinterPreview"]
|
return this.$store.getters["farm/"+this.printer._namespace+"/getPrinterPreview"]
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
printer_webcams: {
|
||||||
|
get() {
|
||||||
|
return this.$store.getters["farm/"+this.printer._namespace+"/getPrinterWebcams"]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
currentWebcam: {
|
||||||
|
get() {
|
||||||
|
const currentCam = this.printer_webcams.find(webcam => webcam.name === this.currentCamName)
|
||||||
|
if (currentCam) return currentCam
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
methods: {
|
methods: {
|
||||||
|
@ -190,7 +190,9 @@ export default {
|
|||||||
Extrude: "Extrude",
|
Extrude: "Extrude",
|
||||||
Macros: "Macros"
|
Macros: "Macros"
|
||||||
},
|
},
|
||||||
FarmPrinterPanel: {},
|
FarmPrinterPanel: {
|
||||||
|
WebcamOff: "Off",
|
||||||
|
},
|
||||||
KlippyStatePanel: {
|
KlippyStatePanel: {
|
||||||
KlippyState: "Klippy-State: ",
|
KlippyState: "Klippy-State: ",
|
||||||
KlippyInfo: "Moonraker can't connect to Klippy!\nPlease check if the Klipper service is running and an UDS (Unix Domain Socket) is configured.",
|
KlippyInfo: "Moonraker can't connect to Klippy!\nPlease check if the Klipper service is running and an UDS (Unix Domain Socket) is configured.",
|
||||||
|
@ -46,10 +46,6 @@ export default {
|
|||||||
commit("setData", data.params[0])
|
commit("setData", data.params[0])
|
||||||
break
|
break
|
||||||
|
|
||||||
case "notify_filelist_changed":
|
|
||||||
commit("notifyFilelistChanged", data.params[0])
|
|
||||||
break
|
|
||||||
|
|
||||||
case "notify_klippy_disconnected":
|
case "notify_klippy_disconnected":
|
||||||
dispatch("disconnectKlippy")
|
dispatch("disconnectKlippy")
|
||||||
break
|
break
|
||||||
|
@ -76,20 +76,6 @@ export default {
|
|||||||
},
|
},
|
||||||
|
|
||||||
getImage: state => {
|
getImage: state => {
|
||||||
/*if (
|
|
||||||
'gui' in state.data &&
|
|
||||||
'webcam' in state.data.gui &&
|
|
||||||
'url' in state.data.gui.webcam &&
|
|
||||||
state.data.gui.webcam.url !== "" &&
|
|
||||||
'bool' in state.data.gui.webcam &&
|
|
||||||
state.data.gui.webcam.bool &&
|
|
||||||
'dashbaord' in state.data.gui &&
|
|
||||||
'boolWebcam' in state.data.gui.dashboard &&
|
|
||||||
state.data.gui.dashboard.boolWebcam
|
|
||||||
) {
|
|
||||||
return state.data.gui.webcam.url
|
|
||||||
} else*/
|
|
||||||
|
|
||||||
if (
|
if (
|
||||||
state.current_file &&
|
state.current_file &&
|
||||||
"filename" in state.current_file &&
|
"filename" in state.current_file &&
|
||||||
@ -256,4 +242,14 @@ export default {
|
|||||||
|
|
||||||
return 0
|
return 0
|
||||||
},
|
},
|
||||||
|
|
||||||
|
getPrinterWebcams: (state) => {
|
||||||
|
if (
|
||||||
|
'gui' in state.data &&
|
||||||
|
'webcam' in state.data.gui &&
|
||||||
|
'configs' in state.data.gui.webcam
|
||||||
|
) return state.data.gui.webcam.configs
|
||||||
|
|
||||||
|
return []
|
||||||
|
}
|
||||||
}
|
}
|
@ -64,19 +64,6 @@ export default {
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
|
||||||
notifyFilelistChanged( state, payload) {
|
|
||||||
if (
|
|
||||||
payload.action === "upload_file" &&
|
|
||||||
payload.item.root === "config" &&
|
|
||||||
payload.item.path === ".mainsail.json"
|
|
||||||
) {
|
|
||||||
fetch('//'+state.socket.hostname+':'+state.socket.port+'/server/files/config/.mainsail.json?time='+Date.now())
|
|
||||||
.then(res => res.json()).then(file => {
|
|
||||||
this.commit("farm/"+state._namespace+"/setMainsailJson", file)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
},
|
|
||||||
|
|
||||||
setDatabases(state, payload) {
|
setDatabases(state, payload) {
|
||||||
Vue.set(state, 'databases', payload.namespaces)
|
Vue.set(state, 'databases', payload.namespaces)
|
||||||
},
|
},
|
||||||
|
Loading…
x
Reference in New Issue
Block a user