2023-08-21 01:51:35 -04:00
|
|
|
<script setup lang="ts">
|
2023-10-17 16:32:59 -04:00
|
|
|
import PvSelect from "@/components/common/pv-select.vue";
|
2023-08-21 01:51:35 -04:00
|
|
|
import { useStateStore } from "@/stores/StateStore";
|
|
|
|
|
import { useCameraSettingsStore } from "@/stores/settings/CameraSettingsStore";
|
|
|
|
|
import { WebsocketPipelineType } from "@/types/WebsocketDataTypes";
|
|
|
|
|
import { computed, ref } from "vue";
|
2023-10-17 16:32:59 -04:00
|
|
|
import PvIcon from "@/components/common/pv-icon.vue";
|
|
|
|
|
import PvInput from "@/components/common/pv-input.vue";
|
2023-08-21 01:51:35 -04:00
|
|
|
import { PipelineType } from "@/types/PipelineTypes";
|
2024-01-15 22:28:34 -05:00
|
|
|
import { useSettingsStore } from "@/stores/settings/GeneralSettingsStore";
|
2023-08-21 01:51:35 -04:00
|
|
|
|
|
|
|
|
const changeCurrentCameraIndex = (index: number) => {
|
|
|
|
|
useCameraSettingsStore().setCurrentCameraIndex(index, true);
|
|
|
|
|
|
|
|
|
|
switch (useCameraSettingsStore().cameras[index].pipelineSettings.pipelineType) {
|
|
|
|
|
case PipelineType.Reflective:
|
|
|
|
|
pipelineType.value = WebsocketPipelineType.Reflective;
|
|
|
|
|
break;
|
|
|
|
|
case PipelineType.ColoredShape:
|
|
|
|
|
pipelineType.value = WebsocketPipelineType.ColoredShape;
|
|
|
|
|
break;
|
|
|
|
|
case PipelineType.AprilTag:
|
|
|
|
|
pipelineType.value = WebsocketPipelineType.AprilTag;
|
|
|
|
|
break;
|
|
|
|
|
case PipelineType.Aruco:
|
|
|
|
|
pipelineType.value = WebsocketPipelineType.Aruco;
|
|
|
|
|
break;
|
2024-01-15 22:28:34 -05:00
|
|
|
case PipelineType.ObjectDetection:
|
|
|
|
|
pipelineType.value = WebsocketPipelineType.ObjectDetection;
|
2023-08-21 01:51:35 -04:00
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Common RegEx used for naming both pipelines and cameras
|
|
|
|
|
const nameChangeRegex = /^[A-Za-z0-9_ \-)(]*[A-Za-z0-9][A-Za-z0-9_ \-)(.]*$/;
|
|
|
|
|
|
|
|
|
|
// Camera Name Edit
|
|
|
|
|
const isCameraNameEdit = ref(false);
|
|
|
|
|
const currentCameraName = ref(useCameraSettingsStore().currentCameraSettings.nickname);
|
|
|
|
|
const startCameraNameEdit = () => {
|
|
|
|
|
currentCameraName.value = useCameraSettingsStore().currentCameraSettings.nickname;
|
|
|
|
|
isCameraNameEdit.value = true;
|
|
|
|
|
};
|
|
|
|
|
const checkCameraName = (name: string): string | boolean => {
|
2023-08-31 16:56:58 -04:00
|
|
|
if (!nameChangeRegex.test(name))
|
|
|
|
|
return "A camera name can only contain letters, numbers, spaces, underscores, hyphens, parenthesis, and periods";
|
|
|
|
|
if (useCameraSettingsStore().cameraNames.some((cameraName) => cameraName === name))
|
|
|
|
|
return "This camera name has already been used";
|
2023-08-21 01:51:35 -04:00
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
};
|
|
|
|
|
const saveCameraNameEdit = (newName: string) => {
|
2023-08-31 16:56:58 -04:00
|
|
|
useCameraSettingsStore()
|
|
|
|
|
.changeCameraNickname(newName, false)
|
|
|
|
|
.then((response) => {
|
|
|
|
|
useStateStore().showSnackbarMessage({
|
|
|
|
|
color: "success",
|
|
|
|
|
message: response.data.text || response.data
|
|
|
|
|
});
|
|
|
|
|
useCameraSettingsStore().currentCameraSettings.nickname = newName;
|
|
|
|
|
})
|
|
|
|
|
.catch((error) => {
|
|
|
|
|
if (error.response) {
|
2023-08-21 01:51:35 -04:00
|
|
|
useStateStore().showSnackbarMessage({
|
2023-08-31 16:56:58 -04:00
|
|
|
color: "error",
|
|
|
|
|
message: error.response.data.text || error.response.data
|
2023-08-21 01:51:35 -04:00
|
|
|
});
|
2023-08-31 16:56:58 -04:00
|
|
|
} else if (error.request) {
|
|
|
|
|
useStateStore().showSnackbarMessage({
|
|
|
|
|
color: "error",
|
|
|
|
|
message: "Error while trying to process the request! The backend didn't respond."
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
useStateStore().showSnackbarMessage({
|
|
|
|
|
color: "error",
|
|
|
|
|
message: "An error occurred while trying to process the request."
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
currentCameraName.value = useCameraSettingsStore().currentCameraSettings.nickname;
|
|
|
|
|
})
|
|
|
|
|
.finally(() => (isCameraNameEdit.value = false));
|
2023-08-21 01:51:35 -04:00
|
|
|
};
|
|
|
|
|
const cancelCameraNameEdit = () => {
|
|
|
|
|
isCameraNameEdit.value = false;
|
|
|
|
|
currentCameraName.value = useCameraSettingsStore().currentCameraSettings.nickname;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Pipeline Name Edit
|
2023-08-31 16:56:58 -04:00
|
|
|
const pipelineNamesWrapper = computed<{ name: string; value: number }[]>(() => {
|
2023-08-21 01:51:35 -04:00
|
|
|
const pipelineNames = useCameraSettingsStore().pipelineNames.map((name, index) => ({ name: name, value: index }));
|
|
|
|
|
|
2023-08-31 16:56:58 -04:00
|
|
|
if (useCameraSettingsStore().isDriverMode) {
|
2023-08-21 01:51:35 -04:00
|
|
|
pipelineNames.push({ name: "Driver Mode", value: WebsocketPipelineType.DriverMode });
|
|
|
|
|
}
|
2023-08-31 16:56:58 -04:00
|
|
|
if (useCameraSettingsStore().isCalibrationMode) {
|
2023-08-21 01:51:35 -04:00
|
|
|
pipelineNames.push({ name: "3D Calibration Mode", value: WebsocketPipelineType.Calib3d });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return pipelineNames;
|
|
|
|
|
});
|
|
|
|
|
const isPipelineNameEdit = ref(false);
|
|
|
|
|
const currentPipelineName = ref(useCameraSettingsStore().currentPipelineSettings.pipelineNickname);
|
|
|
|
|
const startPipelineNameEdit = () => {
|
|
|
|
|
currentPipelineName.value = useCameraSettingsStore().currentPipelineSettings.pipelineNickname;
|
|
|
|
|
isPipelineNameEdit.value = true;
|
|
|
|
|
};
|
|
|
|
|
const checkPipelineName = (name: string): string | boolean => {
|
2023-08-31 16:56:58 -04:00
|
|
|
if (!nameChangeRegex.test(name))
|
|
|
|
|
return "A pipeline name can only contain letters, numbers, spaces, underscores, hyphens, parenthesis, and periods";
|
|
|
|
|
if (useCameraSettingsStore().pipelineNames.some((pipelineName) => pipelineName === name))
|
|
|
|
|
return "This pipeline name has already been used";
|
2023-08-21 01:51:35 -04:00
|
|
|
|
|
|
|
|
return true;
|
|
|
|
|
};
|
|
|
|
|
const savePipelineNameEdit = (name: string) => {
|
|
|
|
|
useCameraSettingsStore().changeCurrentPipelineNickname(name);
|
|
|
|
|
isPipelineNameEdit.value = false;
|
|
|
|
|
};
|
|
|
|
|
const cancelPipelineNameEdit = () => {
|
|
|
|
|
isPipelineNameEdit.value = false;
|
|
|
|
|
currentPipelineName.value = useCameraSettingsStore().currentPipelineSettings.pipelineNickname;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Pipeline Creation
|
|
|
|
|
const showPipelineCreationDialog = ref(false);
|
|
|
|
|
const newPipelineName = ref("");
|
|
|
|
|
const newPipelineType = ref<WebsocketPipelineType>(useCameraSettingsStore().currentWebsocketPipelineType);
|
|
|
|
|
const showCreatePipelineDialog = () => {
|
|
|
|
|
newPipelineName.value = "";
|
|
|
|
|
newPipelineType.value = useCameraSettingsStore().currentWebsocketPipelineType;
|
|
|
|
|
showPipelineCreationDialog.value = true;
|
|
|
|
|
};
|
|
|
|
|
const createNewPipeline = () => {
|
|
|
|
|
const type = newPipelineType.value;
|
2023-08-31 16:56:58 -04:00
|
|
|
if (type === WebsocketPipelineType.DriverMode || type === WebsocketPipelineType.Calib3d) return;
|
2023-08-21 01:51:35 -04:00
|
|
|
useCameraSettingsStore().createNewPipeline(newPipelineName.value, type);
|
|
|
|
|
showPipelineCreationDialog.value = false;
|
|
|
|
|
};
|
|
|
|
|
const cancelPipelineCreation = () => {
|
|
|
|
|
showPipelineCreationDialog.value = false;
|
|
|
|
|
newPipelineName.value = "";
|
|
|
|
|
newPipelineType.value = useCameraSettingsStore().currentWebsocketPipelineType;
|
|
|
|
|
};
|
|
|
|
|
|
2023-10-21 10:46:53 -04:00
|
|
|
// Pipeline Deletion
|
2023-08-21 01:51:35 -04:00
|
|
|
const showPipelineDeletionConfirmationDialog = ref(false);
|
|
|
|
|
const confirmDeleteCurrentPipeline = () => {
|
|
|
|
|
useCameraSettingsStore().deleteCurrentPipeline();
|
|
|
|
|
showPipelineDeletionConfirmationDialog.value = false;
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Pipeline Type Change
|
|
|
|
|
const showPipelineTypeChangeDialog = ref(false);
|
2023-08-31 16:56:58 -04:00
|
|
|
const pipelineTypesWrapper = computed<{ name: string; value: number }[]>(() => {
|
|
|
|
|
const pipelineTypes = [
|
2023-08-21 01:51:35 -04:00
|
|
|
{ name: "Reflective", value: WebsocketPipelineType.Reflective },
|
|
|
|
|
{ name: "Colored Shape", value: WebsocketPipelineType.ColoredShape },
|
2023-10-24 19:39:38 -07:00
|
|
|
{ name: "AprilTag", value: WebsocketPipelineType.AprilTag },
|
|
|
|
|
{ name: "Aruco", value: WebsocketPipelineType.Aruco }
|
2023-08-21 01:51:35 -04:00
|
|
|
];
|
2024-01-15 22:28:34 -05:00
|
|
|
if (useSettingsStore().general.rknnSupported) {
|
|
|
|
|
pipelineTypes.push({ name: "Object Detection", value: WebsocketPipelineType.ObjectDetection });
|
|
|
|
|
}
|
2023-08-21 01:51:35 -04:00
|
|
|
|
2023-08-31 16:56:58 -04:00
|
|
|
if (useCameraSettingsStore().isDriverMode) {
|
2023-08-21 01:51:35 -04:00
|
|
|
pipelineTypes.push({ name: "Driver Mode", value: WebsocketPipelineType.DriverMode });
|
|
|
|
|
}
|
2023-08-31 16:56:58 -04:00
|
|
|
if (useCameraSettingsStore().isCalibrationMode) {
|
2023-08-21 01:51:35 -04:00
|
|
|
pipelineTypes.push({ name: "3D Calibration Mode", value: WebsocketPipelineType.Calib3d });
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return pipelineTypes;
|
|
|
|
|
});
|
|
|
|
|
const pipelineType = ref<WebsocketPipelineType>(useCameraSettingsStore().currentWebsocketPipelineType);
|
|
|
|
|
const currentPipelineType = computed<WebsocketPipelineType>({
|
|
|
|
|
get: () => {
|
2023-08-31 16:56:58 -04:00
|
|
|
if (useCameraSettingsStore().isDriverMode) return WebsocketPipelineType.DriverMode;
|
|
|
|
|
if (useCameraSettingsStore().isCalibrationMode) return WebsocketPipelineType.Calib3d;
|
2023-08-21 01:51:35 -04:00
|
|
|
return pipelineType.value;
|
|
|
|
|
},
|
2023-08-31 16:56:58 -04:00
|
|
|
set: (v) => {
|
2023-08-21 01:51:35 -04:00
|
|
|
pipelineType.value = v;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
const confirmChangePipelineType = () => {
|
|
|
|
|
const type = currentPipelineType.value;
|
2023-08-31 16:56:58 -04:00
|
|
|
if (type === WebsocketPipelineType.DriverMode || type === WebsocketPipelineType.Calib3d) return;
|
2023-08-21 01:51:35 -04:00
|
|
|
useCameraSettingsStore().changeCurrentPipelineType(type);
|
|
|
|
|
showPipelineTypeChangeDialog.value = false;
|
|
|
|
|
};
|
|
|
|
|
const cancelChangePipelineType = () => {
|
|
|
|
|
pipelineType.value = useCameraSettingsStore().currentWebsocketPipelineType;
|
|
|
|
|
showPipelineTypeChangeDialog.value = false;
|
|
|
|
|
};
|
|
|
|
|
|
2023-10-21 10:46:53 -04:00
|
|
|
// Pipeline duplication'
|
|
|
|
|
const duplicateCurrentPipeline = () => {
|
|
|
|
|
useCameraSettingsStore().duplicatePipeline(useCameraSettingsStore().currentCameraSettings.currentPipelineIndex);
|
|
|
|
|
};
|
|
|
|
|
|
2023-08-21 01:51:35 -04:00
|
|
|
// Change Props whenever the pipeline settings are changed
|
|
|
|
|
useCameraSettingsStore().$subscribe((mutation, state) => {
|
|
|
|
|
const currentCameraSettings = state.cameras[useStateStore().currentCameraIndex];
|
|
|
|
|
|
|
|
|
|
switch (currentCameraSettings.pipelineSettings.pipelineType) {
|
|
|
|
|
case PipelineType.Reflective:
|
|
|
|
|
pipelineType.value = WebsocketPipelineType.Reflective;
|
|
|
|
|
break;
|
|
|
|
|
case PipelineType.ColoredShape:
|
|
|
|
|
pipelineType.value = WebsocketPipelineType.ColoredShape;
|
|
|
|
|
break;
|
|
|
|
|
case PipelineType.AprilTag:
|
|
|
|
|
pipelineType.value = WebsocketPipelineType.AprilTag;
|
|
|
|
|
break;
|
|
|
|
|
case PipelineType.Aruco:
|
|
|
|
|
pipelineType.value = WebsocketPipelineType.Aruco;
|
|
|
|
|
break;
|
2024-01-15 22:28:34 -05:00
|
|
|
case PipelineType.ObjectDetection:
|
|
|
|
|
pipelineType.value = WebsocketPipelineType.ObjectDetection;
|
|
|
|
|
break;
|
2023-08-21 01:51:35 -04:00
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
</script>
|
|
|
|
|
|
|
|
|
|
<template>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-card color="primary">
|
2023-08-21 01:51:35 -04:00
|
|
|
<v-row style="padding: 12px 12px 0 24px">
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-col cols="10" class="pa-0">
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-select
|
2023-08-21 01:51:35 -04:00
|
|
|
v-if="!isCameraNameEdit"
|
|
|
|
|
v-model="useStateStore().currentCameraIndex"
|
|
|
|
|
label="Camera"
|
|
|
|
|
:items="useCameraSettingsStore().cameraNames"
|
|
|
|
|
@input="changeCurrentCameraIndex"
|
|
|
|
|
/>
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-input
|
2023-08-21 01:51:35 -04:00
|
|
|
v-else
|
|
|
|
|
v-model="currentCameraName"
|
|
|
|
|
class="pt-2"
|
2023-08-31 16:56:58 -04:00
|
|
|
:input-cols="12 - 3"
|
|
|
|
|
:rules="[(v) => checkCameraName(v)]"
|
2023-08-21 01:51:35 -04:00
|
|
|
label="Camera"
|
2023-10-21 10:46:53 -04:00
|
|
|
@onEnter="saveCameraNameEdit"
|
|
|
|
|
@onEscape="cancelCameraNameEdit"
|
2023-08-21 01:51:35 -04:00
|
|
|
/>
|
|
|
|
|
</v-col>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-col cols="2" style="display: flex; align-items: center; justify-content: center">
|
2023-10-21 10:46:53 -04:00
|
|
|
<div v-if="isCameraNameEdit" style="display: flex; gap: 14px">
|
|
|
|
|
<pv-icon
|
|
|
|
|
icon-name="mdi-content-save"
|
|
|
|
|
color="#c5c5c5"
|
|
|
|
|
:disabled="checkCameraName(currentCameraName) !== true"
|
|
|
|
|
@click="() => saveCameraNameEdit(currentCameraName)"
|
|
|
|
|
/>
|
|
|
|
|
<pv-icon icon-name="mdi-cancel" color="red darken-2" @click="cancelCameraNameEdit" />
|
|
|
|
|
</div>
|
|
|
|
|
<pv-icon
|
|
|
|
|
v-else
|
|
|
|
|
color="#c5c5c5"
|
|
|
|
|
icon-name="mdi-pencil"
|
|
|
|
|
tooltip="Edit Camera Name"
|
|
|
|
|
@click="startCameraNameEdit"
|
|
|
|
|
/>
|
2023-08-21 01:51:35 -04:00
|
|
|
</v-col>
|
|
|
|
|
</v-row>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-row style="padding: 0 12px 0 24px">
|
|
|
|
|
<v-col cols="10" class="pa-0">
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-select
|
2023-08-21 01:51:35 -04:00
|
|
|
v-if="!isPipelineNameEdit"
|
|
|
|
|
:value="useCameraSettingsStore().currentCameraSettings.currentPipelineIndex"
|
|
|
|
|
label="Pipeline"
|
|
|
|
|
tooltip="Each pipeline runs on a camera output and stores a unique set of processing settings"
|
2023-08-31 16:56:58 -04:00
|
|
|
:disabled="useCameraSettingsStore().isDriverMode || useCameraSettingsStore().isCalibrationMode"
|
2023-08-21 01:51:35 -04:00
|
|
|
:items="pipelineNamesWrapper"
|
2023-08-31 16:56:58 -04:00
|
|
|
@input="(args) => useCameraSettingsStore().changeCurrentPipelineIndex(args, true)"
|
2023-08-21 01:51:35 -04:00
|
|
|
/>
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-input
|
2023-08-21 01:51:35 -04:00
|
|
|
v-else
|
|
|
|
|
v-model="currentPipelineName"
|
2023-08-31 16:56:58 -04:00
|
|
|
:input-cols="12 - 3"
|
|
|
|
|
:rules="[(v) => checkPipelineName(v)]"
|
2023-08-21 01:51:35 -04:00
|
|
|
label="Pipeline"
|
2023-10-21 10:46:53 -04:00
|
|
|
@onEnter="(v) => savePipelineNameEdit(v)"
|
|
|
|
|
@onEscape="cancelPipelineNameEdit"
|
2023-08-21 01:51:35 -04:00
|
|
|
/>
|
|
|
|
|
</v-col>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-col cols="2" class="pa-0" style="display: flex; align-items: center; justify-content: center">
|
2023-10-21 10:46:53 -04:00
|
|
|
<div v-if="isPipelineNameEdit" style="display: flex; gap: 14px">
|
|
|
|
|
<pv-icon
|
|
|
|
|
icon-name="mdi-content-save"
|
|
|
|
|
color="#c5c5c5"
|
|
|
|
|
:disabled="checkPipelineName(currentPipelineName) !== true"
|
|
|
|
|
@click="() => savePipelineNameEdit(currentPipelineName)"
|
|
|
|
|
/>
|
|
|
|
|
<pv-icon icon-name="mdi-cancel" color="red darken-2" @click="cancelPipelineNameEdit" />
|
|
|
|
|
</div>
|
|
|
|
|
<v-menu v-else-if="!useCameraSettingsStore().isDriverMode" offset-y nudge-bottom="7" auto>
|
2023-08-21 01:51:35 -04:00
|
|
|
<template #activator="{ on }">
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-icon color="#c5c5c5" v-on="on" @click="cancelPipelineNameEdit"> mdi-menu </v-icon>
|
2023-08-21 01:51:35 -04:00
|
|
|
</template>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-list dark dense color="primary">
|
2023-08-21 01:51:35 -04:00
|
|
|
<v-list-item @click="startPipelineNameEdit">
|
|
|
|
|
<v-list-item-title>
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-icon color="#c5c5c5" :right="true" icon-name="mdi-pencil" tooltip="Edit pipeline name" />
|
2023-08-21 01:51:35 -04:00
|
|
|
</v-list-item-title>
|
|
|
|
|
</v-list-item>
|
|
|
|
|
<v-list-item @click="showCreatePipelineDialog">
|
|
|
|
|
<v-list-item-title>
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-icon color="#c5c5c5" :right="true" icon-name="mdi-plus" tooltip="Add new pipeline" />
|
2023-08-21 01:51:35 -04:00
|
|
|
</v-list-item-title>
|
|
|
|
|
</v-list-item>
|
|
|
|
|
<v-list-item @click="showPipelineDeletionConfirmationDialog = true">
|
|
|
|
|
<v-list-item-title>
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-icon color="red darken-2" :right="true" icon-name="mdi-delete" tooltip="Delete pipeline" />
|
2023-08-21 01:51:35 -04:00
|
|
|
</v-list-item-title>
|
|
|
|
|
</v-list-item>
|
2023-10-21 10:46:53 -04:00
|
|
|
<v-list-item @click="duplicateCurrentPipeline">
|
2023-08-21 01:51:35 -04:00
|
|
|
<v-list-item-title>
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-icon color="#c5c5c5" :right="true" icon-name="mdi-content-copy" tooltip="Duplicate pipeline" />
|
2023-08-21 01:51:35 -04:00
|
|
|
</v-list-item-title>
|
|
|
|
|
</v-list-item>
|
|
|
|
|
</v-list>
|
|
|
|
|
</v-menu>
|
2023-10-21 10:46:53 -04:00
|
|
|
<pv-icon
|
|
|
|
|
v-else-if="useCameraSettingsStore().isDriverMode && useCameraSettingsStore().pipelineNames.length === 0"
|
|
|
|
|
color="#c5c5c5"
|
|
|
|
|
:right="true"
|
|
|
|
|
icon-name="mdi-plus"
|
|
|
|
|
tooltip="Add new pipeline"
|
|
|
|
|
@click="showCreatePipelineDialog"
|
|
|
|
|
/>
|
2023-08-21 01:51:35 -04:00
|
|
|
</v-col>
|
|
|
|
|
</v-row>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-row style="padding: 0 12px 12px 24px">
|
|
|
|
|
<v-col cols="10" class="pa-0">
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-select
|
2023-08-21 01:51:35 -04:00
|
|
|
v-model="currentPipelineType"
|
|
|
|
|
label="Type"
|
|
|
|
|
tooltip="Changes the pipeline type, which changes the type of processing that will happen on input frames"
|
2023-08-31 16:56:58 -04:00
|
|
|
:disabled="useCameraSettingsStore().isDriverMode || useCameraSettingsStore().isCalibrationMode"
|
2023-08-21 01:51:35 -04:00
|
|
|
:items="pipelineTypesWrapper"
|
|
|
|
|
@input="showPipelineTypeChangeDialog = true"
|
|
|
|
|
/>
|
|
|
|
|
</v-col>
|
|
|
|
|
</v-row>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-dialog v-model="showPipelineCreationDialog" dark persistent width="500">
|
|
|
|
|
<v-card dark color="primary">
|
|
|
|
|
<v-card-title> Create New Pipeline </v-card-title>
|
2023-08-21 01:51:35 -04:00
|
|
|
<v-card-text>
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-input
|
2023-08-21 01:51:35 -04:00
|
|
|
v-model="newPipelineName"
|
|
|
|
|
placeholder="Pipeline Name"
|
|
|
|
|
:label-cols="3"
|
2023-08-31 16:56:58 -04:00
|
|
|
:input-cols="12 - 3"
|
2023-08-21 01:51:35 -04:00
|
|
|
label="Pipeline Name"
|
2023-08-31 16:56:58 -04:00
|
|
|
:rules="[(v) => checkPipelineName(v)]"
|
2023-08-21 01:51:35 -04:00
|
|
|
/>
|
2023-10-17 16:32:59 -04:00
|
|
|
<pv-select
|
2023-08-21 01:51:35 -04:00
|
|
|
v-model="newPipelineType"
|
2023-08-31 16:56:58 -04:00
|
|
|
:select-cols="12 - 3"
|
2023-08-21 01:51:35 -04:00
|
|
|
label="Tracking Type"
|
|
|
|
|
tooltip="Pipeline type, which changes the type of processing that will happen on input frames"
|
|
|
|
|
:items="[
|
|
|
|
|
{ name: 'Reflective', value: WebsocketPipelineType.Reflective },
|
|
|
|
|
{ name: 'Colored Shape', value: WebsocketPipelineType.ColoredShape },
|
2023-10-24 19:39:38 -07:00
|
|
|
{ name: 'AprilTag', value: WebsocketPipelineType.AprilTag },
|
2024-01-15 22:28:34 -05:00
|
|
|
{ name: 'Aruco', value: WebsocketPipelineType.Aruco },
|
|
|
|
|
{ name: 'Object Detection', value: WebsocketPipelineType.ObjectDetection }
|
2023-08-21 01:51:35 -04:00
|
|
|
]"
|
|
|
|
|
/>
|
|
|
|
|
</v-card-text>
|
|
|
|
|
<v-divider />
|
|
|
|
|
<v-card-actions>
|
|
|
|
|
<v-spacer />
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-btn color="#ffd843" :disabled="checkPipelineName(newPipelineName) !== true" @click="createNewPipeline">
|
2023-08-21 01:51:35 -04:00
|
|
|
Save
|
|
|
|
|
</v-btn>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-btn color="error" @click="cancelPipelineCreation"> Cancel </v-btn>
|
2023-08-21 01:51:35 -04:00
|
|
|
</v-card-actions>
|
|
|
|
|
</v-card>
|
|
|
|
|
</v-dialog>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-dialog v-model="showPipelineDeletionConfirmationDialog" dark width="500">
|
|
|
|
|
<v-card dark color="primary">
|
|
|
|
|
<v-card-title> Pipeline Deletion Confirmation </v-card-title>
|
2023-10-21 11:09:55 -04:00
|
|
|
<v-card-text>
|
|
|
|
|
Are you sure you want to delete the pipeline
|
|
|
|
|
<b style="color: white; font-weight: bold">{{
|
|
|
|
|
useCameraSettingsStore().currentPipelineSettings.pipelineNickname
|
|
|
|
|
}}</b
|
|
|
|
|
>? This cannot be undone.
|
|
|
|
|
</v-card-text>
|
2023-08-21 01:51:35 -04:00
|
|
|
<v-divider />
|
|
|
|
|
<v-card-actions>
|
|
|
|
|
<v-spacer />
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-btn color="error" @click="confirmDeleteCurrentPipeline"> Yes, I'm sure </v-btn>
|
|
|
|
|
<v-btn color="#ffd843" @click="showPipelineDeletionConfirmationDialog = false"> No, take me back </v-btn>
|
2023-08-21 01:51:35 -04:00
|
|
|
</v-card-actions>
|
|
|
|
|
</v-card>
|
|
|
|
|
</v-dialog>
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-dialog v-model="showPipelineTypeChangeDialog" persistent width="600">
|
|
|
|
|
<v-card color="primary" dark>
|
2023-08-21 01:51:35 -04:00
|
|
|
<v-card-title>Change Pipeline Type</v-card-title>
|
|
|
|
|
<v-card-text>
|
2023-08-31 16:56:58 -04:00
|
|
|
Are you sure you want to change the current pipeline type? This will cause all the pipeline settings to be
|
|
|
|
|
overwritten and they will be lost. If this isn't what you want, duplicate this pipeline first or export
|
|
|
|
|
settings.
|
2023-08-21 01:51:35 -04:00
|
|
|
</v-card-text>
|
|
|
|
|
<v-divider />
|
|
|
|
|
<v-card-actions>
|
|
|
|
|
<v-spacer />
|
2023-08-31 16:56:58 -04:00
|
|
|
<v-btn color="error" @click="confirmChangePipelineType"> Yes, I'm sure </v-btn>
|
|
|
|
|
<v-btn color="#ffd843" @click="cancelChangePipelineType"> No, take me back </v-btn>
|
2023-08-21 01:51:35 -04:00
|
|
|
</v-card-actions>
|
|
|
|
|
</v-card>
|
|
|
|
|
</v-dialog>
|
|
|
|
|
</v-card>
|
|
|
|
|
</template>
|