This commit is contained in:
2024-07-03 09:12:31 +08:00
commit d761f91771
70 changed files with 17366 additions and 0 deletions

26
src/App.vue Normal file
View File

@ -0,0 +1,26 @@
<script setup>
// This starter template is using Vue 3 <script setup> SFCs
// Check out https://vuejs.org/api/sfc-script-setup.html#script-setup
import Greet from "./components/Greet.vue";
</script>
<template>
<div class="container">
<Greet />
</div>
</template>
<style scoped>
.logo.vite:hover {
filter: drop-shadow(0 0 2em #747bff);
}
.logo.vue:hover {
filter: drop-shadow(0 0 2em #249b73);
/* Your additional CSS code here */
}
</style>

251
src/AppHyperSpectral.vue Normal file
View File

@ -0,0 +1,251 @@
<script>
import Greet from "./components/Greet.vue";
import HyperSpectralMainView from "./components/HyperSpectralMainView.vue";
import menubar from "./components/menubar.vue";
import siderleft from "./components/siderleft.vue";
import apphymain from "./apphymain.js"
import setWavelenth from "./components/menubox/SetWavelenth.vue";
import {useToast} from "bootstrap-vue-next";
import EventBus from "./eventBus.js";
import {onMounted} from "vue";
import {message} from "@tauri-apps/api/dialog";
export default {
components: {
Greet,
HyperSpectralMainView,
menubar,
siderleft,
setWavelenth
},
data(){
return {
modal:false,
modaltitle:"test",
modalcomponent:null,
tourdata:{
current:0,
steps:[],
open:false
}
}
},
mounted() {
this.$refs.SiderComponend.methodslist.push(this.$refs.HyperSpectralMainView.plotGraph);
EventBus.on('showbox',this.showbox);
this.inittour();
this.testinmpt();
},
methods: {
...apphymain
},
setup()
{
const {show} = useToast();
function showbox(message){
if (typeof message === 'string') {
message = {title: '提示', body: message}
}
if (typeof message === 'object') {
if (typeof message.title === 'undefined') {
message.title = '提示'
}
if (typeof message.body === 'undefined') {
message.body = ''
}
if (typeof message.interval === 'undefined') {
message.interval = 10
}
// if (typeof message.interval === 'undefined') {
// message.interval = 10
// }
}
show?.({
props: {
headerClass:'hide:true',
title: message.title,
variant: 'info',
pos: 'top-right',
value: 2000,
interval: message.interval,
progressProps: {
variant: 'danger',
},
body: message.body,
noCloseButton: false,
},
})
}
function showboxmini(message){
if (typeof message === 'string') {
message = {title: '提示', body: message}
}
if (typeof message === 'object') {
if (typeof message.title === 'undefined') {
message.title = '提示'
}
if (typeof message.body === 'undefined') {
message.body = ''
}
if (typeof message.interval === 'undefined') {
message.interval = 10
}
let dataforprocess={
percent:100,
info: message.body
}
EventBus.emit('setprogressbar',dataforprocess);
}
}
return {showbox,showboxmini}
}
}
</script>
<template>
<BToastOrchestrator />
<div class="container1">
<BModal v-model="modal" :title="modaltitle" ok-only body-class="windowmodal" class="bmodalnow" noCloseOnBackdrop hideFooter="true" >
<!-- <SetWavelenth></SetWavelenth>-->
<component :is="modalcomponent" ref="Commancompent" style="user-select: none;"></component>
</BModal>
<div class="row menubox">
<div class="col-12">
<menubar @menubalclicked="onmenuclicked"></menubar>
</div>
</div>
<div class="row sencondebody" >
<a-layout>
<a-layout-sider :resize-directions="['right']" style="min-width: 15%;max-width: 50%;" @moving-end="siderresize" >
<!-- <div style="position: fixed;width: 0vw;height:0vh; float: left;display:block;order:-10; z-index: 10 !important;top:100px;left: 0px">-->
<!-- <Draggable style="position: absolute" >-->
<!-- <div>-->
<!-- sdfasdfsdfsadf123123123-->
<!-- </div>-->
<!-- </Draggable>-->
<!-- </div>-->
<a-dropdown trigger="contextMenu" alignPoint >
<siderleft ref="SiderComponend"></siderleft>
<template #content>
<a-doption>Option 1</a-doption>
<a-doption>Option 2</a-doption>
<a-doption>Option 3</a-doption>
</template>
</a-dropdown>
</a-layout-sider>
<a-layout-content style=" position: relative;max-width: 85%;min-width: 50%">
<HyperSpectralMainView ref="HyperSpectralMainView"></HyperSpectralMainView>
</a-layout-content>
</a-layout>
</div>
</div>
<!-- <a-tour v-model:current="tourdata.current" :open="tourdata.open" :steps="tourdata.steps" @close="handleOpen(false)" />-->
</template>
<style scoped type="less">
.container1 {
margin: 0 auto;
padding-top: 0px;;
padding-bottom: 0px;
width: 100%;
height: 100%;
}
.col-3 {
background-color: #f8f9fa;
padding-top: 0px;
padding-bottom: 0px;
padding: 0px;
border-right: 1px solid #dee2e6;
position: relative;
}
.col-9 {
padding: 0px;
position: relative;
}
.menubox{
background-color: #f8f9fa;
padding-top: 0px;
padding-bottom: 0px;
width: 100vw;
height: 5vh;
border-bottom: 1px solid #dee2e6;
max-height:5vh;
}
.sencondebody{
padding-top: 0px;
padding-bottom: 0px;
width: 100vw;
height: 95vh;
}
.bmodalnow{
user-select: none;
}
</style>
<style>
.modal-dialog{
max-width: 90vw;
max-height: 90vh;
width: 80vw;
height: 90vh;
padding: 0px;
margin: 0px;
user-select: none
}
.modal-content
{
width: 100%;
height: 100%;
user-select: none
}
.modal{
--bs-modal-width: 90vw !important;
--bs-modal-height:90vh !important;
user-select: none
}
</style>

172
src/apphymain.js Normal file
View File

@ -0,0 +1,172 @@
import {invoke} from "@tauri-apps/api/tauri";
import {ref} from "vue";
import {appWindow, LogicalSize, WebviewWindow} from "@tauri-apps/api/window";
import setWavelenth from "./components/menubox/SetWavelenth.vue";
import SetName from "./components/menubox/SetName.vue";
import SetWorkmode from "./components/menubox/SetWorkmode.vue";
import setCalibrate from "./components/menubox/SetCalibrate.vue";
import Greet from "./components/Greet.vue";
import {$ref} from "vue3-json-editor/dist/vue3-json-editor.cjs.js";
//引入
export default {
async onmenuclicked(command){
console.log("menuclicked main "+command.name)
if (command.type=="Set")
{
if (!this.isDevOpen())
{
return;
}
}
if (command.type=="File"){
if (command.name=="Advance"){
this.modaltitle="高级测试模式";
this.modalcomponent=Greet;
this.showModal();
}
}
// if (command.name=="setting"){
//
// this.modaltitle="设置波长";
// this.modalcomponent=setWavelenth
// this.showModal();
// }
if (command.name=="DevInfo"){
let iscommenopen=this.$refs.SiderComponend.SerialInfo.isopen;
if (!iscommenopen)
{
alert("请先打开设备");
return
}
this.modaltitle="设置设备信息";
this.modalcomponent=SetName
await this.$nextTick();
this.$refs.Commancompent.name=this.$refs.SiderComponend.Devinfo.name;
this.$refs.Commancompent.version=this.$refs.SiderComponend.Devinfo.Version;
this.$refs.Commancompent.upother=this.$refs.SiderComponend.GetSenSorInfo
this.showModal();
}
if (command.name=="Workmode"){
this.modaltitle="设置工作模式";
this.modalcomponent=SetWorkmode
await this.$nextTick();
this.$refs.Commancompent.GetSenSorInfo();
this.showModal();
}
if(command.name=="Weavelenth")
{
if (!this.isinAdvanceMode()) return;
this.modaltitle="设置波长";
this.modalcomponent=setWavelenth
await this.$nextTick();
// this.$refs.Commancompent.GetSenSorInfo();
this.showModal();
}
if (command.name=="Calibrate")
{
if (!this.isinAdvanceMode()) return;
this.modaltitle="能量定标";
this.modalcomponent=setCalibrate
await this.$nextTick();
// this.$refs.Commancompent.GetSenSorInfo();
this.showModal();
}
},
async newwindow() {
const webview = new WebviewWindow("element", {
url: "/element",
// 可自行添加属性配置 窗口配置
width: 2000,
height: 900,
//center:true,
//decorations:false
});
await webview.once("tauri://created", function () {
// webview window successfully created
// 窗口创建成功 打印1
console.log(1);
});
await webview.once("tauri://error", function (e) {
// an error happened creating the webview window
// 窗口创建失败 打印2
console.log(2);
});
// testWindow.open();
},
showModal() {
this.modal=!this.modal;
// alert("showModal")
},
isDevOpen(){
let iscommenopen=this.$refs.SiderComponend.SerialInfo.isopen;
if (!iscommenopen)
{
alert("请先打开设备");
return false;
}
return true;
},
isinAdvanceMode(){
let isadvance=this.$refs.SiderComponend.Devinfo.work_mode;
if(isadvance!="advanced_mode")
{
alert("请先切换到高级模式");
return false;
}
return true;
},
inittour(){
var steps=[
{
title: 'Save',
description: 'Save your changes.',
target:()=>this.$refs.SiderComponend.value&& this.$refs.SiderComponend.value.$el,
}
]
this.tourdata.steps=steps;
},
siderresize(){
this.$refs.HyperSpectralMainView.echartresize();
},
async testinmpt(){
let x=[0.0,0.5, 0.569, 1.138, 1.707, 2.276, 2.845];
let y=[0.0, 0.4,0.5, 1.0, 0.5, 0.0, -0.5];
let cc=await invoke("interpolate_spline",{x:x,y,step:0.1});
console.log(cc);
}
}

1
src/assets/vue.svg Normal file
View File

@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" aria-hidden="true" role="img" class="iconify iconify--logos" width="37.07" height="36" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 198"><path fill="#41B883" d="M204.8 0H256L128 220.8L0 0h97.92L128 51.2L157.44 0h47.36Z"></path><path fill="#41B883" d="m0 0l128 220.8L256 0h-51.2L128 132.48L50.56 0H0Z"></path><path fill="#35495E" d="M50.56 0L128 133.12L204.8 0h-47.36L128 51.2L97.92 0H50.56Z"></path></svg>

After

Width:  |  Height:  |  Size: 496 B

194
src/components/Greet.vue Normal file
View File

@ -0,0 +1,194 @@
<script >
import { ref } from "vue";
import { invoke } from "@tauri-apps/api/tauri";
import 'jsoneditor'
import { defineComponent, reactive, toRefs } from 'vue'
import { Vue3JsonEditor } from 'vue3-json-editor'
export default {
name: "Greet",
components: {
Vue3JsonEditor
},
data() {
return {
greetMsg: "",
name: "",
datatype: "json",
ComePort: [],
portname: "",
bandrate: 115200,
Statusnow: { isopen: false,buttonstring:"打开串口" },
jsondata: { command: "get_sensor_info" },
jsonoutdata: {},
editorOptions: {
onRenderMenu: (menuItems, node) => {
// Customize or modify the context menu items here
// For example, adding a custom action
menuItems.push({
label: 'Custom Action',
action: () => {
// Your custom action logic here
console.log('Custom action clicked!');
},
});
return menuItems;
},
},
};
},
mounted() {
var that = this;
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
invoke("getportnames").then((message) => {
that.ComePort = message;
console.log(message);
if (message.length > 0) {
that.portname = that.ComePort[0];
}
});
},
methods: {
async greet() {
if (this.Statusnow.isopen == false) {
alert("串口未打开");
return;
}
var that = this;
console.log(this.jsondata);
invoke("sendtoportAndgetreturn",{data:this.jsondata,datatype:"json"}).then((message) => {
that.greetMsg = message;
that.jsonoutdata = JSON.parse(message.content);
console.log(message);
});
},
async onJsonChange(json) {
console.log('json change', json);
this.jsondata = json;
},
async onModeChange(mode) {
console.log('mode change', mode);
},
async opencom() {
if(this.Statusnow.isopen){
invoke("closecome").then((message) => {
this.greetMsg = message;
// alert(message);
if (message == "Port is closed") {
this.Statusnow.isopen = false;
this.Statusnow.buttonstring = "打开串口";
}
});
}else{
var that = this;
invoke("opencom",{portname:this.portname,baudrate:this.bandrate}).then((message) => {
that.greetMsg = message;
console.log(message);
// alert(message);
if (message == "Port is open") {
that.Statusnow.isopen = true;
that.Statusnow.buttonstring = "关闭串口";
}
});
}
},
}
};
// const greetMsg = ref("");
// const name = ref("");
// const datatype = ref("json");
// async function greet() {
// var that= this;
// // Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
// invoke('getportnames').then((message) =>{
// that.greetMsg = message;
// console.log(message);
// })
// }
</script>
<template>
<div>
<p>选择串口号:
<select v-model="portname">
<option v-for="item in ComePort" :key="item">{{item}}</option>
</select>
<select v-model="bandrate">
<option value="4800">4800</option>
<option value="9600">9600</option>
<option value="19200">19200</option>
<option value="38400">38400</option>
<option value="57600">57600</option>
<option value="115200">115200</option>
<option value="480600">480600</option>
<option value="921600">921600</option>
</select>
<button @click="opencom" >{{Statusnow.buttonstring }}</button>
<select v-model="datatype" >
<option value="string">字符串</option>
<option value="json">json</option>
<option value="bytes">二进制</option>
</select>
</p>
<input v-if="datatype!='json'" v-model="name" placeholder="Enter your name" />
<Vue3JsonEditor class="jsonview" v-if="datatype=='json'" lang="zh" :options="editorOptions" v-model="jsondata" @json-change="onJsonChange" @mode-change="onModeChange" />
<button @click="greet" style="z-index: 99;">发送</button>
<!-- <p>{{ greetMsg }}</p>-->
<vue3-json-editor class="jsonview" v-model="jsonoutdata" />
</div>
</template>
<style scoped>
</style>
<style>
.jsoneditor-tree{
min-width: 100px !important;
}
.jsoneditor-outer{
min-width: 100px !important;
height: 35vh !important;
}
</style>

View File

@ -0,0 +1 @@

View File

@ -0,0 +1,85 @@
<script >
import EventBus from "../eventBus.js";
import HyperSpectralMainViewMethods from './HyperSpectralMethod.js';
import eventBus from "../eventBus.js";
export default {
name: 'HyperSpectralMainView',
mounted() {
this.initChart();
eventBus.on("plotsetwavelength",this.setwavelength);
eventBus.on('setprogressbar',this.setprogressbar);
},
data() {
return {
Comname: '请选择',
options:[],
datatosave:[],
percent:0,
progressinfo:"",
progressstate:false,
Pathtosave:"",
nowNumber:0,
Filename:"Plot",
pathofdir:"./data",
sideropen:false ,
}
},
methods: {
...HyperSpectralMainViewMethods,
onClose(){
this.sideropen=false;
},
}
}
function echartresize()
{
}
</script>
<template>
<div class="chart-container" id="charmian" ref="chart" ></div>
<BProgress :max="100" class="progressbar" >
<BProgressBar style="background-color: #335c60" striped :animated="progressstate"
:value="percent"
:label="`${(percent).toFixed(2)}%`"
/>
</BProgress>
<b-form-floating-label style="font-size: 80%;color: #06efcc">{{progressinfo}}</b-form-floating-label>
<!-- <a-drawer-->
<!-- title="Basic Drawer"-->
<!-- placement="right"-->
<!-- :closable="false"-->
<!-- :open="sideropen"-->
<!-- :get-container="false"-->
<!-- :style="{ position: 'absolute' }"-->
<!-- @close="onClose"-->
<!-- >-->
<!-- <p>Some contents...</p>-->
<!-- </a-drawer>-->
</template>
<style scoped>
.chart-container {
background-color: #f8f9fa;
width:100%;
height: 90vh;
}
.progressbar{
width:90%;
margin-left: 5%;
position: absolute;
bottom: 10px;
align-self: center;
}
</style>

View File

@ -0,0 +1,224 @@
import { fs, dialog } from '@tauri-apps/api';
import * as echarts from 'echarts';
import { invoke } from "@tauri-apps/api/tauri";
import { exit } from '@tauri-apps/api/process';
export default {
async handlekeydown(event) {
if (event.code == "Space") {
//datatosave 保存
console.log(this.datatosave)
var data = this.datatosave;
var xValues = []
var yValues = []
var lenthofdata = data.length
for (var i = 0; i < lenthofdata; i++) {
xValues.push(data[i][0]);
yValues.push(data[i][1]);
}
var lenth = xValues.length;
var strcsv = ""
for (var i = 0; i < lenth; i++) {
strcsv += xValues[i] + "," + yValues[i] + "\r\n";
}
await fs.writeFile(this.Pathtosave, strcsv);
// fs.writeFileSync(this.Pathtosave, strcsv);
this.nowNumber++;
this.Pathtosave = this.pathofdir + "/" + this.Filename + this.nowNumber + ".csv";
alert("保存" + this.Pathtosave + "成功")
}
},
setwavelength(data) {
this.option.xAxis.max = data.max;
this.option.xAxis.min = data.min;
const chartDom = this.$refs.chart;
let chart = echarts.getInstanceByDom(chartDom);
chart.setOption(this.option);
},
plotGraph(data, index) {
this.option.series[index].data = data;
const chartDom = this.$refs.chart;
let chart = echarts.getInstanceByDom(chartDom);
chart.setOption(this.option);
},
setprogressbar(message) {
if (typeof message === 'undefined') return;
if (typeof message === 'object') {
if (typeof message.percent === 'undefined') message.percent = this.percent;
if (typeof message.info === 'undefined') message.info = this.progressinfo;
this.percent = message.percent;
this.progressinfo = message.info;
}
let percent = this.percent;
//如果percent >0 且小于100
if (percent > 0 && percent < 100) {
this.progressstate = true;
} else {
this.progressstate = false;
}
},
initChart() {
const chartDom = this.$refs.chart;
// chartDom.style.width = '100%';
// chartDom.style.height = '100%';
let chart = echarts.init(chartDom,null,{renderer: 'svg'});
this.option = {
legend: {
data: ['UP', 'DOWN'], // 图例名称
show: true,// 显示图例
selectedMode: 'multiple', // 图例的选择模式。默认开启图例开关可选singlemultiple
},
// ECharts 配置选项
xAxis: {
type: 'value',
boundaryGap: false,// 显示连续的刻度
min: 0,
max: 1100,
dataZoom: [
{
type: 'inside', // 内置数据区域缩放
start: 0, // 初始缩放范围的起始位置0%
end: 100 // 初始缩放范围的结束位置100%
}
],
triggerEvent: true
},
animation: false,
yAxis: {
type: 'value',
//min:0,
},
tooltip:{
trigger:'axis',
},
axisPointer: {
link: { xAxisIndex: 'all' },
label: {
backgroundColor: '#777'
}
},
grid: {
left: '5%',
right: '5%',
bottom: '5%',
top: '5%'
},
// visualMap: [
// {
// type: 'continuous',
// }
// ],
dataZoom: [
{
type: 'slider', // 内置数据区域缩放,包括滚轮缩放
xAxisIndex: [0], // 对应 x 轴
filterMode: 'none' // 不过滤数据
},
{
type: 'slider', // 内置数据区域缩放,包括滚轮缩放
yAxisIndex: [0], // 对应 y 轴
filterMode: 'none', // 不过滤数据
//width :15
}
],
// legend: {
// data: ['曲线'], // 图例名称
// show: true ,// 显示图例
// //selectedMode: 'multiple', // 图例的选择模式。默认开启图例开关可选singlemultiple
// },
series: [
{
data: [[1, 150], [2, 230], [3, 224], [4, 218], [5, 135], [6, 147], [7, 260]], // 使用二维数组表示数据点的坐标
type: 'line',
name: 'UP',
symbol: 'none', // 不显示数据点
smooth: false, // 不使用平滑处理
// step: 'start' // 设置 step 类型的起始位置
},
{
data: [[1, 150], [2, 230], [3, 224], [4, 218], [5, 135], [6, 147], [7, 260]], // 使用二维数组表示数据点的坐标
type: 'line',
name: 'DOWN',
symbol: 'none', // 不显示数据点
smooth: false, // 不使用平滑处理
//step: 'start' // 设置 step 类型的起始位置
}
]
};
window.onresize=function () {
chart.resize()
}
chart.setOption(this.option);
chart.on('click', function (params) {
console.log(params);
});
chart.on('legendselectchanged', function (params) {
console.log(params);
});
chart.on('click', 'series.line', function (params) {
console.log(params);
});
chart.on('mouseover', {seriesIndex: 1, name: 'xx'}, function (params) {
console.log(params);
});
//this.echartresize()
},
echartresize(){
console.log("resize")
const chartDom = this.$refs.chart;
let chart = echarts.getInstanceByDom(chartDom);
chart.resize()
},
GetSenSorInfo() {
var Command = { command: "get_sensor_info" };
let data = {
data: Command.toString(),
datatype: "json"
}
SerilPort.SendtoPort(data)
console.log(SerilPort.ReadData(0x01));
}
}

View File

@ -0,0 +1,177 @@
import {invoke} from "@tauri-apps/api/tauri";
import CommanDeffine from "../serportdefine.js";
import EventBus from "../../eventBus.js";
async function Dev_Opt() {
var Command={command:"start_opt"};
let data={
data:Command,
datatype:"json"
}
let message=await invoke("sendtoportAndgetreturn",data);
if (message.datatype==0x00)
{
let ret=JSON.parse(message.content);
console.log(ret);
}
await EnsureNotWorking();
data.data.command="get_opt";
message=await invoke("sendtoportAndgetreturn",data);
var shuttertimes=0;
if (message.datatype==0x00)
{
let ret=JSON.parse(message.content);
console.log(ret);
shuttertimes=ret.opt;
}
return shuttertimes;
}
async function Get_Date_on_Derction(drection,shuttertimes,autoremovedark=false,avgnumber=1) {
var Command={command:"take_one_job"};
let data={
data:Command,
datatype:"json"
}
data.data.command="start_collect";
if (drection=="UP")
{
data.data.direction="up";
data.data.shutter_time=Number(shuttertimes);
}else if (drection=="DOWN")
{
data.data.direction="down";
data.data.shutter_time=Number(shuttertimes);
}else if(drection=="DARK")
{
data.data.direction="dark";
data.data.shutter_time=Number(shuttertimes);
}
if (autoremovedark&&drection!="DARK")
{
data.data.remove_dark="yes";
}else {
data.data.remove_dark="no";
}
data.data.collect_times=avgnumber;
let message=await invoke("sendtoportAndgetreturn",data);
await EnsureNotWorking();
//获取数据 UPDN
data = {
data: {
command: "get_data",
return_data_type: CommanDeffine.DataTypeforSend.UpDN
},
datatype: "json"
}
if(drection=="UP")
{
data.data.return_data_type=CommanDeffine.DataTypeforSend.UpDN;
}else if(drection=="DOWN")
{
data.data.return_data_type=CommanDeffine.DataTypeforSend.DOWNDN;
} else if (drection=="DARK")
{
data.data.return_data_type=CommanDeffine.DataTypeforSend.UpDarkDN;
}
message=await invoke("sendtoportAndgetreturn",data);
while (message.datatype!=0x02)
{
message=await invoke("sendtoportAndgetreturn",data);
}
return message.data
}
async function Get_Device_Info() {
var Command={command:"get_sensor_info"};
let data={
data:Command,
datatype:"json"
}
let message=await invoke("sendtoportAndgetreturn",data);
if (message.datatype==108)
{
return {error:"error"};
}
let json=JSON.parse(message.content);
return json;
}
async function EnsureNotWorking(){
let data={
data:{
command:"get_caiji_state"
},
datatype:"json"
}
let message=await invoke("sendtoportAndgetreturn",data);
let ret=JSON.parse(message.content);
while (ret.caiji_state!="finish")
{
//发送进度信息
let dataforprocess={
percent:ret.percent,
info:ret.info
}
EventBus.emit('setprogressbar',dataforprocess);
await delay(1000);
message=await invoke("sendtoportAndgetreturn",data);
if (message.content=="g time no data retrun")
{
alert("长时间没有数据返回");
return;
}
ret=JSON.parse(message.content);
}
let dataforprocess={
percent:100,
info:""
}
EventBus.emit('setprogressbar',dataforprocess);
}
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
export default {
Dev_Opt,
Get_Date_on_Derction,
Get_Device_Info
}

View File

@ -0,0 +1,431 @@
import {invoke} from "@tauri-apps/api/tauri";
import {ref} from "vue";
import CommanDeffine from "./serportdefine.js";
import EventBus from "../eventBus.js";
import SerialportMethod from "./SerialPort/SerialportMethod.js";
export default {
async listSerialPorts() {
let that=this;
var i=0;
var aa=await invoke("getportnames");
invoke("getportnames").then((message) => {
message.forEach(function (port) {
console.log(port.path);
that.options.push({value:port,label:port,index:i++})
})
});
},
async initserialport() {
if (this.Comname == "请选择") {
alert("请选择串口");
return
}
var selectitem = document.getElementById("selectitem");
var btn = document.getElementById("opencom");
//禁用
selectitem.disabled = true;
var btnn = document.getElementById("closecomeside");
btnn.disabled = false;
this.cssme.comportvariant = "success";
// let buffer = Buffer.alloc(0);
let portinfo ={
portname: this.Comname,
baudrate: 115200,
}
let ret= await invoke("opencom",portinfo);
if (ret!="Port is open")
{
EventBus.emit('showbox',{title:"设备",body:"打开串口失败"});
return
}
var isopen=await this.GetSenSorInfo();
this.SerialInfo.isopen=isopen;
if (isopen)
{
btn.disabled = true;
EventBus.emit('showbox',{title:"设备",body:"打开串口成功"});
}else
{
btn.disabled = false;
EventBus.emit('showbox',{title:"设备",body:"打开串口失败,请更换串口 或者检查设备是否连接"});
}
// alert("打开串口成功");
},
async closecomport() {
var btn = document.getElementById("opencom");
btn.disabled = false;
var btnn = document.getElementById("closecomeside");
btnn.disabled = true;
alert(await invoke("closecome"));
this.SerialInfo.isopen=false;
},
async Dingbiao_OPT(){
this.iscollecting=true;
this.ShutterTime[0]=await SerialportMethod.Dev_Opt();
this.ShutterTime[1]=this.ShutterTime[0];
this.iscollecting=false;
},
async GetoneData(event,caijiavgNumber=1){
let caijimoshi=this.Devinfo.work_mode;
if (caijimoshi=="manual_mode") {
await this.GetoneDataall();
}
if (caijimoshi=="advanced_mode")
{
if (this.caijidirection=="UP")
await this.GetDataDrection("UP",caijiavgNumber);
if (this.caijidirection=="DOWN")
await this.GetDataDrection("DOWN",caijiavgNumber);
if (this.caijidirection=="ALL")
{
await this.GetDataDrection("UP",caijiavgNumber);
await delay(1000)
await this.GetDataDrection("DOWN",caijiavgNumber);
}
if(this.caijidirection=="DARK")
{
await this.GetDataDrection("DARK",caijiavgNumber);
}
}
},
async GetDataDrection(drection,avgnumber=1){
this.iscollecting=true;
var shuttertimes=1;
if (drection=="UP")
{
shuttertimes=Number(this.ShutterTime[0]);
}else if (drection=="DOWN")
{
shuttertimes=Number(this.ShutterTime[1]);
}else if(drection=="DARK")
{
shuttertimes=Number(this.ShutterTime[0]);
}
//获取波长系数
let coeffweave1=this.Devinfo.bochangxishu.a0;
let coeffweave2=this.Devinfo.bochangxishu.a1;
let coeffweave3=this.Devinfo.bochangxishu.a2;
let coeffweave4=this.Devinfo.bochangxishu.a3;
//获取数据 UPDN
let datatoshow=await SerialportMethod.Get_Date_on_Derction(drection,shuttertimes,this.autoremovedark,avgnumber);
if (this.dataprocessconfig.useSG)
{
datatoshow.data= await invoke("sg_smooth",{data:datatoshow.data,window:31,order:7});
// console.log(smooth);
}
if (this.dataprocessconfig.usehighpass)
{
datatoshow.data=await invoke("Gaussian_filter_high",{data:datatoshow.data,sigma:30});
//console.log(aaa);
}
let lenthofdata=datatoshow.data.length;
var temp=[];
// for (var i=0;i<lenthofdata;i++)
// {
// temp.push(datatoshow.data[2047-i])
// }
// datatoshow.data=temp;
let dataforshow=[];
for (var i=0;i<lenthofdata;i++)
{
var weave=coeffweave1*i*i*i+coeffweave2*i*i+coeffweave3*i+coeffweave4;
dataforshow.push([weave,datatoshow.data[i]]);
}
if (drection=="UP")
{
this.dataup=datatoshow;
this.datainfoup.infolist=[];
this.datainfoup.hasrecive=true;
this.datainfoup.infolist.push({key:"intertime",value:datatoshow.shutter_time});
this.datainfoup.infolist.push({key:"序号",value:datatoshow.index});
this.datainfoup.infolist.push({key:"方向",value:datatoshow.direction});
this.Senddatatoother(dataforshow,0);
}else if (drection=="DOWN"){
this.datadown=datatoshow;
this.datainfodown.hasrecive=true;
this.datainfodown.infolist=[];
this.datainfodown.infolist.push({key:"intertime",value:datatoshow.shutter_time});
this.datainfodown.infolist.push({key:"序号",value:datatoshow.index});
this.datainfodown.infolist.push({key:"方向",value:datatoshow.direction});
this.Senddatatoother(dataforshow,1);
}
if (drection=="DARK"){
this.dataup=datatoshow;
this.datainfoup.infolist=[];
this.datainfoup.hasrecive=true;
this.datainfoup.infolist.push({key:"intertime",value:datatoshow.shutter_time});
this.datainfoup.infolist.push({key:"序号",value:datatoshow.index});
this.datainfoup.infolist.push({key:"方向",value:datatoshow.direction});
this.Senddatatoother(dataforshow,0);
}
this.iscollecting=false;
},
async EnsureNotWorking(){
let data={
data:{
command:"get_caiji_state"
},
datatype:"json"
}
let message=await invoke("sendtoportAndgetreturn",data);
let ret=JSON.parse(message.content);
while (ret.caiji_state!="finish")
{
//发送进度信息
let dataforprocess={
percent:ret.percent,
info:ret.info
}
EventBus.emit('setprogressbar',dataforprocess);
await delay(100);
message=await invoke("sendtoportAndgetreturn",data);
if (message.content=="g time no data retrun")
{
alert("长时间没有数据返回");
return;
}
ret=JSON.parse(message.content);
}
let dataforprocess={
percent:100,
info:""
}
EventBus.emit('setprogressbar',dataforprocess);
},
async GetoneDataall(){
this.iscollecting=true;
var Command={command:"take_one_job"};
let data={
data:Command,
datatype:"json"
}
if (1)
{
/////////////////////////////////////////////
let message =await invoke("sendtoport",data);
let data2={
commanid:0x00,
waitTimeJson:1
}
let message2=await invoke("readformport",data2);
await delay(500);
await this.EnsureNotWorking();
await invoke("clearportbuff");
}
//获取波长系数
let coeffweave1=this.Devinfo.bochangxishu.a0;
let coeffweave2=this.Devinfo.bochangxishu.a1;
let coeffweave3=this.Devinfo.bochangxishu.a2;
let coeffweave4=this.Devinfo.bochangxishu.a3;
//获取数据 UPDN
data = {
data: {
command: "get_data",
return_data_type: CommanDeffine.DataTypeforSend.UpDN
},
datatype: "json"
}
let message1=await invoke("sendtoportAndgetreturn",data);
while (message1.datatype!=0x02)
{
message1=await invoke("sendtoportAndgetreturn",data);
}
let datatoshowup=message1.data;
this.dataup=datatoshowup;
let lenthofdataup=datatoshowup.data.length;
let dataforshowup=[];
for (var i=0;i<lenthofdataup;i++)
{
var weave=coeffweave1*i*i*i+coeffweave2*i*i+coeffweave3*i+coeffweave4;
dataforshowup.push([weave,datatoshowup.data[2048-i-1]]);
}
this.datainfoup.infolist=[];
this.datainfoup.hasrecive=true;
this.datainfoup.infolist.push({key:"intertime",value:datatoshowup.shutter_time});
this.datainfoup.infolist.push({key:"序号",value:datatoshowup.index});
this.datainfoup.infolist.push({key:"方向",value:datatoshowup.direction});
//this.datainfoup.data.push({key:"温度",value:dataforshowup.temperature[0]});
// this.datainfoup.data.push("序号",dataforshowup.index);
// this.datainfoup.data.push("方向",dataforshowup.direction);
// this.datainfoup.data.push("温度",dataforshowup.temperature[0]);
this.Senddatatoother(dataforshowup,0);
data = {
data: {
command: "get_data",
return_data_type: CommanDeffine.DataTypeforSend.DOWNDN
},
datatype: "json"
}
let messagedown=await invoke("sendtoportAndgetreturn",data);
while (messagedown.datatype!=0x02)
{
messagedown=await invoke("sendtoportAndgetreturn",data);
}
let datatoshowdown=messagedown.data;
this.datadown=datatoshowdown;
let lenthofdatadown=datatoshowdown.data.length;
let dataforshowdown=[];
for (var i=0;i<lenthofdatadown;i++)
{
var weave=coeffweave1*i*i*i+coeffweave2*i*i+coeffweave3*i+coeffweave4;
dataforshowdown.push([weave,datatoshowdown.data[2048-i-1]]);
}
this.datainfodown.hasrecive=true;
this.datainfodown.infolist=[];
this.datainfodown.infolist.push({key:"intertime",value:datatoshowdown.shutter_time});
this.datainfodown.infolist.push({key:"序号",value:datatoshowdown.index});
this.datainfodown.infolist.push({key:"方向",value:datatoshowdown.direction});
//this.datainfodown.data.push("序号",datatoshowdown.index);
//this.datainfodown.data.push("方向",datatoshowdown.direction);
//this.datainfodown.data.push("温度",datatoshowdown.temperature[0]);
this.Senddatatoother(dataforshowdown,1);
this.iscollecting=false;
//获取数据
},
Senddatatoother( data,index){
let methodslist = this.methodslist;
if (methodslist.length == 0) {
return;
}
for (var i=0;i<methodslist.length;i++)
{
methodslist[i](data,index);
}
// foteach(methodslist, function (index, item) {
// item.method(data);
// });
},
async GetSenSorInfo(){
var Command={command:"get_sensor_info"};
let data={
data:Command,
datatype:"json"
}
let that = this;
let message=await invoke("sendtoportAndgetreturn",data);
if (message.datatype==108)
{
return false;
}
let json=JSON.parse(message.content);
this.Devinfo=json;
//获取波长系数
let coeffweave1=this.Devinfo.bochangxishu.a0;
let coeffweave2=this.Devinfo.bochangxishu.a1;
let coeffweave3=this.Devinfo.bochangxishu.a2;
let coeffweave4=this.Devinfo.bochangxishu.a3;
var wevaconfig={
min:coeffweave1*0*0*0+coeffweave2*0*0+coeffweave3*0+coeffweave4,
max:coeffweave1*2048*2048*2048+coeffweave2*2048*2048+coeffweave3*2048+coeffweave4
}
EventBus.emit('plotsetwavelength',wevaconfig);
this.Devinfo.SerilNumber=json.serialnumber;
if (json.caiji_mode==1) {
this.Devinfo.Caji_mode = "连续采集";
}else{
this.Devinfo.Caji_mode = "单次采集";
}
this.Devinfo.name=json.name;
this.Devinfo.Version=json.version;
switch (json.return_data_type) {
case 0x10:
this.Devinfo.Datatype="DN/Dark";
break;
case 0x00:
this.Devinfo.Datatype="DN";
break;
case 0x01:
this.Devinfo.Datatype="Radiance";
break;
case 0x11:
this.Devinfo.Datatype="Radiance/Dark";
break;
case 0x30:
this.Devinfo.Datatype="Dark";
break;
default:
this.Devinfo.Datatype="未知";
break;
}
this.devinfoshow.infolist=[];
this.devinfoshow.infolist.push({key:"设备名称",value:this.Devinfo.name});
this.devinfoshow.infolist.push({key:"设备序列号",value:this.Devinfo.SerilNumber});
this.devinfoshow.infolist.push({key:"采集模式",value:this.Devinfo.Caji_mode});
this.devinfoshow.infolist.push({key:"数据类型",value:this.Devinfo.Datatype});
return true;
}
}
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

View File

@ -0,0 +1,34 @@
<script>
import {invoke} from "@tauri-apps/api/tauri";
export default {
name: "commentep",
data(){
return {
Devinfo:{
work_mode:0,
}
}
},
methods: {
async GetSenSorInfo() {
var Command = {command: "get_sensor_info"};
let data = {
data: Command,
datatype: "json"
}
let message = await invoke("sendtoportAndgetreturn", data);
this.Devinfo = JSON.parse(message);
}
}
}
</script>
<template>
</template>
<style scoped>
</style>

View File

@ -0,0 +1,3 @@
{
"pathofsave": "./data"
}

166
src/components/menubar.vue Normal file
View File

@ -0,0 +1,166 @@
<script >
import { BDropdownItem,BDropdown,BDropdownDivider,BButtonGroup,BButton,BModal,BNavbar,BNavbarBrand,BNavbarNav,BNavItem,BNavItemDropdown,BToast,useToast } from 'bootstrap-vue-next';
import { ref,Teleport} from 'vue';
import EventBus from "../eventBus.js";
export default {
name: 'menubar',
components: {
BDropdownItem,
BDropdown,
BDropdownDivider,
BButtonGroup,
BButton,
BModal,
BNavbar,
BNavbarBrand,
BNavbarNav,
BNavItem,
BNavItemDropdown,
BToast
},
emits: ['menubalclicked'],
data() {
return {
msg: 'Welcome to Your Vue.js App',
modal:false,
}
},
setup(props, context) {
const active = ref(false);
return {active}
},
mounted() {
window.addEventListener("keydown",this.handlekeydown)
},
methods: {
showbox(){
EventBus.emit('showbox',"hello","提示11")
},
onmenuclick(type, name) {
console.log("menu " + name + " click");
let command = {
name: name,
type: type
}
this.$emit("menubalclicked", command)
},
handlekeydown(event) {
// console.log(event.key);
if (event.ctrlKey) {
if (event.key == "n" || event.key == "N") {
this.onmenuclick('Set', 'Workmode');
}
if (event.key == "d" || event.key == "D") {
this.onmenuclick('Set', 'DevInfo');
}
if (event.key == "w" || event.key == "W") {
this.onmenuclick('Set', 'Weavelenth');
}
if (event.key == "c" || event.key == "C") {
this.onmenuclick('Set', 'Calibrate');
}
}
}
}
}
</script>
<!--<script setup lang="ts">-->
<!--import { BDropdownItem,BDropdown,BDropdownDivider,BButtonGroup,BButton,BModal,BNavbar,BNavbarBrand,BNavbarNav,BNavItem,BNavItemDropdown,BToast,useToast } from 'bootstrap-vue-next';-->
<!--import { ref} from 'vue';-->
<!--const {show1} = useToast();-->
<!--const active = ref(false)-->
<!--</script>-->
<template>
<BNavbar variant="dark" v-b-color-mode="'dark'" style="height: 5vh">
<BNavbarNav>
<BNavItemDropdown text="文件" right>
<BDropdownItem href="#">新建</BDropdownItem>
<BDropdownItem href="#" >打开</BDropdownItem>
<BDropdownItem href="#">保存</BDropdownItem>
<BDropdownItem href="#">另存为</BDropdownItem>
<BDropdownDivider></BDropdownDivider>
<BDropdownItem href="#">退出</BDropdownItem>
<BDropdownItem href="#" @click="onmenuclick('File','Advance')">高级</BDropdownItem>
</BNavItemDropdown>
<!-- &lt;!&ndash; Navbar dropdowns &ndash;&gt;-->
<!-- <BNavItemDropdown text="窗口" right>-->
<!-- <BDropdownItem @click="showbox">EN</BDropdownItem>-->
<!-- <BDropdownItem >ES</BDropdownItem>-->
<!-- <BDropdownItem href="#">RU</BDropdownItem>-->
<!-- <BDropdownItem href="#">FA</BDropdownItem>-->
<!-- </BNavItemDropdown>-->
<BNavItemDropdown text="设置" right>
<BDropdownItem @click="onmenuclick('Set','Workmode')">工作模式</BDropdownItem>
<BDropdownItem @click="onmenuclick('Set','DevInfo')">设备信息</BDropdownItem>
<BDropdownItem @click="onmenuclick('Set','Weavelenth')">波长系数</BDropdownItem>
<BDropdownItem @click="onmenuclick('Set','Calibrate')">定标</BDropdownItem>
</BNavItemDropdown>
<!-- <Teleport to="body">-->
<!-- <div class="toast-container position-fixed " style="top:0px;right: 0px;width: 300px" >-->
<!-- <BToast v-model="active" variant="info" interval="10" value="100" progress-props="{-->
<!-- variant: 'danger',-->
<!-- },">-->
<!-- <template #title>-->
<!-- Title-->
<!-- </template>-->
<!-- 你好-->
<!-- </BToast>-->
<!-- </div>-->
<!-- </Teleport>-->
<!-- <BButton @click="active = !active">Toggle</BButton>-->
</BNavbarNav>
<div class="btgroup">
<b-button variant="secondary" pill class="siglebt">DC</b-button>
<b-button variant="secondary" pill class="siglebt">Rad</b-button>
<b-button variant="secondary" pill class="siglebt">WR</b-button>
<b-button variant="secondary" pill class="siglebt">OPT</b-button>
</div>
</BNavbar>
</template>
<style scoped>
.navbar {
background-color: #f8f9fa;
width: 100vw;
}
.btgroup{
position: absolute;
right: 15%;
}
.siglebt{
radio: 50%;
font-size: 10px;
height: 40px;
width: 40px;
text-align: center;
padding: 0px;
margin-left: 10px;
}
</style>

View File

@ -0,0 +1,597 @@
<script>
import SerialportMethod from "../SerialPort/SerialportMethod.js";
import * as echarts from "echarts";
import EventBus from "../../eventBus.js";
import {dialog, fs} from "@tauri-apps/api";
import {invoke} from "@tauri-apps/api/tauri";
export default {
name: "SetCalibrate",
data(){
return {
shutter_time_up:1,
shutter_time_down:1,
option_up:{},
option_down:{},
option_lamp:{},
Devinfo:{
work_mode:0,
},
DataUP:{shutter_time:0,value_lable:0},
DataDown:{shutter_time:0,value_lable:0},
LampData:{value_lable:0},
caijicishu:[1,1],
upGain:{gain:[],shutter_time:0},
downGain:{gain:[],shutter_time:0},
}
},
mounted() {
//100ms 后执行
setTimeout(() => {
this.initChart();
}, 100);
// setTimeout(() => {
// this.readFileAndParse()
// }, 1000);
// this.initChart();
},
methods: {
async readFileAndParse() {
var options= {
defaultPath: "../",
directory: false,
title: "请选择保存路径",
}
var pathofdir=await dialog.open(options);
try {
// 读取文件内容
const data = await fs.readTextFile(pathofdir);
// 解析文件内容
const lines = data.split('\n');
const valueLine = lines.shift(); // 读取第一行
const [key, value] = valueLine.split('='); // 解析第一行内容
const valueVar = parseFloat(value); // 将 value 转换为数字
const weaveValues = [];
const valueValues = [];
// 解析剩余行的内容
for (const line of lines) {
if (line.trim() !== '') { // 排除空行
const [weave, val] = line.split(' ').map(Number); // 将每一行的两个值转换为数字
weaveValues.push(weave*1000);
valueValues.push(val);
}
}
let coeffweave1=this.Devinfo.bochangxishu.a0;
let coeffweave2=this.Devinfo.bochangxishu.a1;
let coeffweave3=this.Devinfo.bochangxishu.a2;
let coeffweave4=this.Devinfo.bochangxishu.a3;
let lenthofdata=2048;
let weavetarget=[];
for (var i=0;i<lenthofdata;i++)
{
var weave=coeffweave1*i*i*i+coeffweave2*i*i+coeffweave3*i+coeffweave4;
weavetarget.push(weave);
}
let valuetarget= await invoke("interpolate_spline_at_points",{
x:weaveValues,
y:valueValues,
xTarget:weavetarget
});
// console.log(valuetarget);
this.LampData={weave:weavetarget,value:valuetarget,value_lable:valueVar};
var dataforshow=[];
for (var i=0;i<lenthofdata;i++)
{
dataforshow.push([weavetarget[i],valuetarget[i]]);
}
var char_lamp=echarts.getInstanceByDom(this.$refs.chart_lamp);
this.option_lamp.series[0].data=dataforshow;
char_lamp.setOption(this.option_lamp);
} catch (err) {
console.error('Error reading file:', err);
}
},
async OPT_devic(dire) {
var shuttertime = await SerialportMethod.Dev_Opt();
if (dire == 0) this.shutter_time_up = shuttertime;
else this.shutter_time_down = shuttertime;
},
async initChart() {
this.Devinfo= await SerialportMethod.Get_Device_Info();
var coeff=[];
coeff[0]=this.Devinfo.bochangxishu.a0;
coeff[1]=this.Devinfo.bochangxishu.a1;
coeff[2]=this.Devinfo.bochangxishu.a2;
coeff[3]=this.Devinfo.bochangxishu.a3;
const chartDom_up = this.$refs.chart_up;
let chart_up = echarts.init(chartDom_up, null, {renderer: 'svg'});
let chart_down = echarts.init(this.$refs.chart_down, null, {renderer: 'svg'});
let chart_lamp = echarts.init(this.$refs.chart_lamp, null, {renderer: 'svg'});
chart_up.resize();
chart_down.resize();
chart_lamp.resize();
this.option_up = {
// ECharts 配置选项
xAxis: {
type: 'value',
boundaryGap: false,// 显示连续的刻度
min: 0,
max: 1100,
dataZoom: [
{
type: 'inside', // 内置数据区域缩放
start: 0, // 初始缩放范围的起始位置0%
end: 100 // 初始缩放范围的结束位置100%
}
],
triggerEvent: true
},
animation: false,
yAxis:[ {
type: 'value',
//min:0,
},
{
type: 'value',
//min:0,
}
],
tooltip: {
trigger: 'axis',
},
axisPointer: {
link: {xAxisIndex: 'all'},
label: {
backgroundColor: '#777'
}
},
grid: {
left: '5%',
right: '5%',
bottom: '10%',
top: '5%'
},
// visualMap: [
// {
// type: 'continuous',
// }
// ],
dataZoom: [
{
type: 'inside', // 内置数据区域缩放包括滚轮缩放
xAxisIndex: [0], // 对应 x
filterMode: 'none' // 不过滤数据
},
{
type: 'inside', // 内置数据区域缩放包括滚轮缩放
yAxisIndex: [0], // 对应 y
filterMode: 'none', // 不过滤数据
//width :15
}
],
legend: {
data: ['DN'], // 图例名称
show: true ,// 显示图例
//selectedMode: 'multiple', // 图例的选择模式默认开启图例开关可选singlemultiple
},
series: [
{
data: [[1, 150], [2, 230], [3, 224], [4, 218], [5, 135], [6, 147], [7, 260]], // 使用二维数组表示数据点的坐标
type: 'line',
name: 'DN',
symbol: 'none', // 不显示数据点
smooth: false, // 不使用平滑处理
// step: 'start' // 设置 step 类型的起始位置
}
// ,
// {
// data: [[1, 150], [2, 230], [3, 224], [4, 218], [5, 135], [6, 147], [7, 260]], // 使用二维数组表示数据点的坐标
// type: 'line',
// name: 'data',
// symbol: 'none', // 不显示数据点
// smooth: false, // 不使用平滑处理
// yAxisIndex: 1,
// // step: 'start' // 设置 step 类型的起始位置
// }
]
};
this.option_up.xAxis.max =coeff[3];
this.option_up.xAxis.min = 2048*2048*2048*coeff[0]+2048*2048*coeff[1]+2048*coeff[2]+coeff[3];
this.option_lamp = JSON.parse(JSON.stringify(this.option_up));
this.option_down = JSON.parse(JSON.stringify(this.option_up));
chart_up.setOption(this.option_up);
chart_down.setOption(this.option_down);
this.option_lamp.legend.data = ['Lamp'];
this.option_lamp.series[0].name = 'Lamp';
chart_lamp.setOption(this.option_lamp);
},
async Get_Data_direction(dire) {
let coeffweave1=this.Devinfo.bochangxishu.a0;
let coeffweave2=this.Devinfo.bochangxishu.a1;
let coeffweave3=this.Devinfo.bochangxishu.a2;
let coeffweave4=this.Devinfo.bochangxishu.a3;
if (dire == "UP") {
var data = await SerialportMethod.Get_Date_on_Derction(dire,this.shutter_time_up,false,Number(this.caijicishu[0]))
this.DataUP=data;
this.DataUP.value_lable=0
//获取波长系数
var lenthofdata=data.data.length;
let dataforshow=[];
for (var i=0;i<lenthofdata;i++)
{
var weave=coeffweave1*i*i*i+coeffweave2*i*i+coeffweave3*i+coeffweave4;
dataforshow.push([weave,data.data[i]]);
}
this.option_up.series[0].data = dataforshow;
var chart_up = echarts.getInstanceByDom(this.$refs.chart_up);
chart_up.setOption(this.option_up);
// console.log(dataforshow);
}else if(dire=="DOWN")
{
var data = await SerialportMethod.Get_Date_on_Derction(dire,this.shutter_time_down,false,Number(this.caijicishu[0]))
this.DataDown=data;
this.DataDown.value_lable=0
//获取波长系数
var lenthofdata=data.data.length;
let dataforshow=[];
for (var i=0;i<lenthofdata;i++)
{
var weave=coeffweave1*i*i*i+coeffweave2*i*i+coeffweave3*i+coeffweave4;
dataforshow.push([weave,data.data[i]]);
}
this.option_down.series[0].data = dataforshow;
var chart_down = echarts.getInstanceByDom(this.$refs.chart_down);
chart_down.setOption(this.option_down);
// console.log(dataforshow);
}
this.computCalibrate()
},
async computCalibrate(){
if(this.upGain.shutter_time!=0)
{
let coeffweave1=this.Devinfo.bochangxishu.a0;
let coeffweave2=this.Devinfo.bochangxishu.a1;
let coeffweave3=this.Devinfo.bochangxishu.a2;
let coeffweave4=this.Devinfo.bochangxishu.a3;
var uprandiance=[];
if(this.DataUP.data.length!=0)
{
for (var i=0;i<this.DataUP.data.length;i++)
{
var weave=coeffweave1*i*i*i+coeffweave2*i*i+coeffweave3*i+coeffweave4;
var data=this.DataUP.data[i]*this.upGain.gain[i]*this.upGain.shutter_time/this.DataUP.shutter_time;
uprandiance.push([weave,data]);
}
var series=
{
data: [[1, 150], [2, 230], [3, 224], [4, 218], [5, 135], [6, 147], [7, 260]], // 使用二维数组表示数据点的坐标
type: 'line',
name: 'Radiance',
symbol: 'none', // 不显示数据点
smooth: false, // 不使用平滑处理
yAxisIndex: 1,
// step: 'start' // 设置 step 类型的起始位置
}
series.data=uprandiance;
if(this.option_up.series.length==1)
{
this.option_up.series.push(series);
this.option_up.legend.data.push('Radiance');
}else{
this.option_up.series[1]=series;
}
var chart_up = echarts.getInstanceByDom(this.$refs.chart_up);
chart_up.setOption(this.option_up);
//this.option_up.series
}
}
if(this.downGain.shutter_time!=0)
{
let coeffweave1=this.Devinfo.bochangxishu.a0;
let coeffweave2=this.Devinfo.bochangxishu.a1;
let coeffweave3=this.Devinfo.bochangxishu.a2;
let coeffweave4=this.Devinfo.bochangxishu.a3;
var downrandiance=[];
if(this.DataDown.data.length!=0)
{
for (var i=0;i<this.DataDown.data.length;i++)
{
var weave=coeffweave1*i*i*i+coeffweave2*i*i+coeffweave3*i+coeffweave4;
var data=this.DataDown.data[i]*this.downGain.gain[i]*this.upGain.shutter_time/this.DataDown.shutter_time;
downrandiance.push([weave,data]);
}
var series=
{
data: [[1, 150], [2, 230], [3, 224], [4, 218], [5, 135], [6, 147], [7, 260]], // 使用二维数组表示数据点的坐标
type: 'line',
name: 'Radiance',
symbol: 'none', // 不显示数据点
smooth: false, // 不使用平滑处理
yAxisIndex: 1,
// step: 'start' // 设置 step 类型的起始位置
}
series.data=downrandiance;
if(this.option_down.series.length==1)
{
this.option_down.series.push(series);
this.option_down.legend.data.push('Radiance');
}else{
this.option_down.series[1]=series;
}
var chart_down = echarts.getInstanceByDom(this.$refs.chart_down);
chart_down.setOption(this.option_down);
//this.option_up.series
}
}
},
async SaveGaindata(){
if(this.upGain.shutter_time!=0)
{
await invoke("savecalibratefile",{
gain:this.upGain.gain,
shutter:this.upGain.shutter_time,
direction:true,
filepath:"./calibratefile/upgain.bin"
});
await invoke("sendcalibratetodev",{
gain:this.upGain.gain,
shutter:this.upGain.shutter_time,
direction:true
});
}
if(this.downGain.shutter_time!=0)
{
await invoke("savecalibratefile",{
gain:this.downGain.gain,
shutter:this.downGain.shutter_time,
direction:true,
filepath:"./calibratefile/downgain.bin"
});
}
},
async Start_Comput_Coeff(){
let lampData=this.LampData.value;
let lampLabel=this.LampData.value_lable;
let UpData=this.DataUP.data;
let UpLabel=this.DataUP.value_lable;
let UpShutter=this.DataUP.shutter_time;
let DownData=this.DataDown.data;
let DownLabel=this.DataDown.value_lable;
let DownShutter=this.DataDown.shutter_time;
if (lampLabel==0)
{
alert("请先导入灯数据");
return;
}
if (DownShutter==0||UpShutter==0)
{
alert("请先采集数据");
return;
}
if (UpLabel==0||DownLabel==0)
{
alert("请填写对应的Value");
return;
}
let gainofup=[];
let gainofdown=[];
for (var i=0;i<UpData.length;i++)
{
let upDn=UpData[i];
let downDn=DownData[i];
let lampup=lampData[i]*UpLabel/lampLabel;
let lampdown=lampData[i]*DownLabel/lampLabel;
let gainup=lampup/upDn;
let gaindown=lampdown/downDn;
gainofup.push(gainup);
gainofdown.push(gaindown);
}
this.upGain.gain=gainofup;
this.upGain.shutter_time=UpShutter;
this.downGain.gain=gainofdown;
this.downGain.shutter_time=DownShutter;
this.computCalibrate()
this.SaveGaindata();
}
}
}
</script>
<template>
<div class="container" style="width: 100%;height: 100%;max-width:100%;margin: 0px;padding: 0px">
<div class="row linebox">
<!-- 按钮区域-->
<div class="col-2 buttonme">
<b-button variant="secondary" pill class="siglebt" @click="readFileAndParse()">导入灯数据</b-button>
</div>
<!-- ///中间区域-->
<div class="col-9 centerme">
<div class="chart-container" id="charmian_lamp" ref="chart_lamp" ></div>
</div>
<!-- ///尾部区域-->
<div class="col-1 tailme">
<b-form-floating-label style="margin: auto" v-show="LampData.value_lable!==0">value:{{LampData.value_lable}}</b-form-floating-label>
</div>
</div>
<!-- 中建行 -->
<div class="row linebox">
<!-- 按钮区域-->
<div class="col-2 buttonme" style="padding: 0px" size="sm">
<b-input-group append="ms">
<b-input-group-prepend>
<b-button variant="secondary" style="margin: auto" @click="OPT_devic(0)">OPT</b-button>
</b-input-group-prepend>
<b-form-input v-model="shutter_time_up"></b-form-input>
</b-input-group>
<b-input-group append="次">
<b-input-group-prepend>
<b-button variant="secondary" style="margin: auto" @click="Get_Data_direction('UP')">采集向上数据</b-button>
</b-input-group-prepend>
<b-form-input v-model="caijicishu[0]"></b-form-input>
</b-input-group>
</div>
<!-- ///中间区域-->
<div class="col-9 centerme">
<div class="chart-container" id="charmian_up" ref="chart_up" ></div>
</div>
<!-- ///尾部区域-->
<div class="col-1 tailme">
<b-form-floating-label style="margin: auto" v-show="DataUP.shutter_time!==0">Shutter_Time:{{DataUP.shutter_time}}</b-form-floating-label>
<b-input-group prepend="Lamp_Value" size="sm" v-show="DataUP.shutter_time!==0">
</b-input-group>
<b-form-input v-model="DataUP.value_lable"></b-form-input>
</div>
</div>
<!-- 向下 -->
<div class="row linebox">
<!-- 按钮区域-->
<div class="col-2 buttonme">
<b-input-group append="ms">
<b-input-group-prepend>
<b-button variant="secondary" style="margin: auto" @click="OPT_devic(1)"> OPT</b-button>
</b-input-group-prepend>
<b-form-input v-model="shutter_time_down"></b-form-input>
</b-input-group>
<b-input-group append="次">
<b-input-group-prepend>
<b-button variant="secondary" @click="Get_Data_direction('DOWN')">采集向下数据</b-button>
</b-input-group-prepend>
<b-form-input v-model="caijicishu[1]"></b-form-input>
</b-input-group>
</div>
<!-- ///中间区域-->
<div class="col-9 centerme">
<div class="chart-container" id="charmian_up" ref="chart_down" ></div>
</div>
<!-- ///尾部区域-->
<div class="col-1 tailme">
<b-form-floating-label style="margin: auto" v-show="DataDown.shutter_time!==0">Shutter_Time:{{DataDown.shutter_time}}</b-form-floating-label>
<b-input-group prepend="Lamp_Value" size="sm" v-show="DataDown.shutter_time!==0">
</b-input-group>
<b-form-input v-model="DataDown.value_lable"></b-form-input>
</div>
</div>
</div>
<p style="position:absolute ;bottom: 10px;width: 100%;height: 30px" >
<b-button @click="updataName" style="position:absolute;left: 20px ">导入已有文件</b-button>
<b-button @click="Start_Comput_Coeff()" style="position:absolute; left: 150px ">计算</b-button>
<b style="position:absolute; left: 250px;border: #0f0f0f 1px solid; margin: auto">adsfsdsadfsdf</b>
<b-button @click="updataName" style="position:absolute;right: 20px ">设置</b-button>
</p>
</template>
<style scoped>
.linebox{
width: 100%;
height: 30%;
margin: 0px;
padding: 0px;
border-bottom:1px solid #d2dede;
max-width: 100%;
}
.buttonme{
background-color: #f8f9fa;
padding-top: 0px;
padding-bottom: 0px;
padding: 0px;
border-right: 1px solid #d2dede;
align-content: center;
}
.centerme{
padding-top: 0px;
padding-bottom: 0px;
padding: 0px;
border-right: 1px solid #d2dede;
}
.tailme{
background-color: #f8f9fa;
margin: auto;
}
.chart-container{
width: 100%;
height:100%;
}
</style>

View File

@ -0,0 +1,66 @@
<script>
import {invoke} from "@tauri-apps/api/tauri";
export default {
name: "SetName",
data(){
return {
name:"null",
version:"000"
}
},
methods: {
async updataName() {
var comman={command:"set_sensor_info",name:this.name,version:this.version}
let data={
data:comman,
datatype:"json"
}
let that = this;
let message=await invoke("sendtoport",data);
await new Promise(resolve => setTimeout(resolve, 500));
console.log(message);
//其他地方传过来
if (typeof this.upother === 'function') {
this.upother();
} else {
// 函数未定义
console.log("need rewrite")
}
}
}
}
</script>
<template>
<div style="position: relative;width: 100%;height: 100%">
<BRow class="my-1">
<BCol sm="2">
<label for="input-none">设备名称</label>
</BCol>
<BCol sm="10">
<BFormInput id="input-none" :state="null" placeholder="No validation" v-model="name" />
</BCol>
</BRow>
<BRow class="my-1">
<BCol sm="2">
<label for="input-none">设备版本号</label>
</BCol>
<BCol sm="10">
<BFormInput id="input-none" :state="null" placeholder="No validation" v-model="version" />
</BCol>
</BRow>
<p style="position:absolute ;bottom: 10px;width: 100%;height: 30px" >
<b-button @click="updataName" style="position:absolute;right: 20px ">设置</b-button>
</p>
</div>
</template>
<style scoped>
</style>

View File

@ -0,0 +1,303 @@
<script>
import {invoke} from "@tauri-apps/api/tauri";
import * as echarts from "echarts";
import SerialportMethod from "../SerialPort/SerialportMethod.js";
export default {
name: "SetWavelenth",
data() {
return {
option: {},
Devinfo: {
work_mode: 0,
bochangxishu: {
a0: 0,
a1: 0,
a2: 0,
a3: 0
},
},
shutter_time_up: 0,
Data:{}
}
},
async mounted() {
let that=this;
//await
await setTimeout(function() {
that.GetSenSorInfo();
// 这里是你要在100毫秒后执行的代码
}, 100);
await setTimeout(function() {
that.GetSenSorInfo();
// 这里是你要在100毫秒后执行的代码
that.initChart();
}, 1000);
},
methods: {
async GetSenSorInfo() {
var Command = {command: "get_sensor_info"};
let data = {
data: Command,
datatype: "json"
}
let message = await invoke("sendtoportAndgetreturn", data);
this.Devinfo = JSON.parse(message.content);
},
async OPT_devic(){
var shuttertime = await SerialportMethod.Dev_Opt();
this.shutter_time_up = shuttertime;
},
async initChart() {
await this.$nextTick();
const chartDom = this.$refs.chart_weavelenth;
// chartDom.style.width = '100%';
// chartDom.style.height = '100%';
let height = chartDom.offsetHeight;
let width = chartDom.clientWidth;
let chart = echarts.init(chartDom);
var coeff=[];
coeff[0]=this.Devinfo.bochangxishu.a0;
coeff[1]=this.Devinfo.bochangxishu.a1;
coeff[2]=this.Devinfo.bochangxishu.a2;
coeff[3]=this.Devinfo.bochangxishu.a3;
this.option = {
// ECharts 配置选项
xAxis: {
type: 'value',
boundaryGap: false,// 显示连续的刻度
min: 0,
max: 510,
dataZoom: [
{
type: 'inside', // 内置数据区域缩放
start: 0, // 初始缩放范围的起始位置0%
end: 100 // 初始缩放范围的结束位置100%
}
]
},
animation: false,
yAxis: {
type: 'value',
//min:0,
},
grid: {
left: '5%',
right: '5%',
bottom: '5%',
top: '5%'
},
dataZoom: [
{
type: 'inside', // 内置数据区域缩放,包括滚轮缩放
xAxisIndex: [0], // 对应 x 轴
filterMode: 'none' // 不过滤数据
},
{
type: 'inside', // 内置数据区域缩放,包括滚轮缩放
yAxisIndex: [0], // 对应 y 轴
filterMode: 'none' // 不过滤数据
}
],
// legend: {
// data: ['曲线'], // 图例名称
// show: true ,// 显示图例
// //selectedMode: 'multiple', // 图例的选择模式。默认开启图例开关可选singlemultiple
// },
series: [
{
data: [[1, 150], [2, 230], [3, 224], [4, 218], [5, 135], [6, 147], [7, 260]], // 使用二维数组表示数据点的坐标
type: 'line',
symbol: 'none', // 不显示数据点
smooth: false, // 不使用平滑处理
step: 'start' // 设置 step 类型的起始位置
}
]
};
this.option.xAxis.max =coeff[3];
this.option.xAxis.min = 2048*2048*2048*coeff[0]+2048*2048*coeff[1]+2048*coeff[2]+coeff[3];
chart.setOption(this.option);
chart.dispatchAction({
type: 'resize',
// 可以指定宽和高,如果不指定则默认取容器的大小
// width: '新的宽度',
// height: '新的高度'
});
chart.resize();
},
async findpeak(){
let dataforpeak=this.Data.data;
var peaks=await invoke("find_peek",{data:dataforpeak,minheigh:1000});
console.log(peaks);
let peaksforshow=[];
let coeffweave1=this.Devinfo.bochangxishu.a0;
let coeffweave2=this.Devinfo.bochangxishu.a1;
let coeffweave3=this.Devinfo.bochangxishu.a2;
let coeffweave4=this.Devinfo.bochangxishu.a3;
peaks.forEach(element => {
var weave=coeffweave1*element[0]*element[0]*element[0]+coeffweave2*element[0]*element[0]+coeffweave3*element[0]+coeffweave4;
peaksforshow.push([weave,element[1],element[0]]);
});
let chartpeak=
{
data:peaksforshow, // 使用二维数组表示数据点的坐标
type: 'scatter',
label: {
show: true,
position: 'top',
formatter: function (params) {
return params.value[2]
}
}
}
if (this.option.series.length<2)
{
this.option.series.push(chartpeak);
}
else
{
this.option.series[1]=chartpeak;
}
var chart_up = echarts.getInstanceByDom(this.$refs.chart_weavelenth);
chart_up.setOption(this.option);
},
async GetOneData(){
let coeffweave1=this.Devinfo.bochangxishu.a0;
let coeffweave2=this.Devinfo.bochangxishu.a1;
let coeffweave3=this.Devinfo.bochangxishu.a2;
let coeffweave4=this.Devinfo.bochangxishu.a3;
var data = await SerialportMethod.Get_Date_on_Derction("UP",this.shutter_time_up,false,1)
this.Data=data; //获取波长系数
var lenthofdata=data.data.length;
let dataforshow=[];
for (var i=0;i<lenthofdata;i++)
{
var weave=coeffweave1*i*i*i+coeffweave2*i*i+coeffweave3*i+coeffweave4;
dataforshow.push([weave,data.data[i]]);
}
this.option.series[0].data = dataforshow;
var chart_up = echarts.getInstanceByDom(this.$refs.chart_weavelenth);
chart_up.setOption(this.option);
// console.log(dataforshow);
}
}
}
</script>
<template >
<div class="container" style="width: 100%;height: 100%;margin: 0px;padding: 0px">
<div class="row" style="height: 100%">
<div class="col-2">
<b-input-group class="my-1" >
<BInputGroupPrepend is-text class="myinputprepend">a0</BInputGroupPrepend>
<b-form-input type="number" step="0.00000000000001" v-model="Devinfo.bochangxishu.a0" ></b-form-input>
</b-input-group>
<b-input-group class="my-1" >
<BInputGroupPrepend is-text class="myinputprepend">a1</BInputGroupPrepend>
<b-form-input type="number" step="0.00000000000001" v-model="Devinfo.bochangxishu.a1" ></b-form-input>
</b-input-group>
<b-input-group class="my-1" >
<BInputGroupPrepend is-text class="myinputprepend">a2</BInputGroupPrepend>
<b-form-input type="number" step="0.00000000000001" v-model="Devinfo.bochangxishu.a2" ></b-form-input>
</b-input-group>
<b-input-group class="my-1" >
<BInputGroupPrepend is-text class="myinputprepend">a3</BInputGroupPrepend>
<b-form-input type="number" step="0.00000000000001" v-model="Devinfo.bochangxishu.a3" ></b-form-input>
</b-input-group>
<p style="position:absolute ;bottom: 10px;width: 100%;height: 30px" >
<b-button @click="GetSenSorInfo" style="position:absolute;right: 20px ">恢复</b-button>
</p>
</div>
<div class="col-10">
<div style="position: relative; height: 90%;width: 100%;">
<b-button @click="findpeak()" style="position:absolute;right: 20px;z-index: 10; ">寻峰</b-button>
<div class="chart-container" ref="chart_weavelenth"></div>
</div>
<p style="position:absolute ;bottom: 10px;width: 100%;height: 30px" >
<b-input-group append="ms" style="position:absolute;left: 20px;width:20% ">
<b-input-group-prepend>
<b-button variant="secondary" style="margin: auto" @click="OPT_devic(0)">OPT</b-button>
</b-input-group-prepend>
<b-form-input v-model="shutter_time_up"></b-form-input>
</b-input-group>
<b-button @click="GetOneData" style="position:absolute;left: 25% ">获取数据</b-button>
<b-button @click="updataName" style="position:absolute; right: 50% ">计算</b-button>
<b-button @click="updataName" style="position:absolute;right: 20px ">设置</b-button>
</p>
</div>
</div>
</div>
</template>
<style scoped>
.col-2 {
background-color: #f8f9fa;
padding-top: 0px;
padding-bottom: 0px;
padding: 0px;
border-right: 1px solid #d2dede;
position: relative;
}
.col-10 {
padding: 0px;
position: relative;
}
.chart-container {
background-color: #f8f9fa;
width:100%;
height: 100%;
}
.container {
background-color: #f8f9fa;
width:100%;
height: 100%;
max-width: 100%;
}
</style>

View File

@ -0,0 +1,152 @@
<script>
import SiderleftSerilportMethod from "../SiderleftSerilportMethod.js";
import {invoke} from "@tauri-apps/api/tauri";
import EventBus from "../../eventBus.js";
import eventBus from "../../eventBus.js";
export default {
name: "SetWorkmode",
data() {
return {
Devinfo: {
work_mode: 0,
}
}
},
mounted() {
// this.GetSenSorInfo();
},
methods: {
async GetSenSorInfo() {
var Command = {command: "get_sensor_info"};
let data = {
data: Command,
datatype: "json"
}
let message = await invoke("sendtoportAndgetreturn", data);
this.Devinfo = JSON.parse(message.content);
this.Devinfo.start_time = this.convertimetostr(this.Devinfo.start_time);
this.Devinfo.stop_time = this.convertimetostr(this.Devinfo.stop_time);
},
coverstrtotime(timeStr) {
// 分离小时和分钟
let [hours, minutes] = timeStr.split(':').map(Number);
// 计算数值
let num = hours + minutes / 100;
console.log(num); // 输出 10.4
return num;
},
convertimetostr(num) {
// num=10.40
// 分离整数部分和小数部分
let hours = Math.floor(num);
let minutes = Math.round((num - hours) * 100);
if (hours < 10) {
hours = '0' + hours;
}
// 格式化分钟部分为两位数
if (minutes < 10) {
minutes = '0' + minutes;
}
// 构建时间字符串
let timeStr = `${hours}:${minutes}`;
return timeStr;
},
async setWorkmode() {
console.log(this.Devinfo);
//单次和连续都属于手动模式
if (this.Devinfo.work_mode == "manual_mode") {
let Command = {command: "set_work_mode",work_mode:"manual_mode"};
await this.senddatatoserilport(Command);
Command = {command: "set_time_interval",time_interval:this.Devinfo.time_interval};
await this.senddatatoserilport(Command);
//设置采集模式连续
// Command = {command: "set_caiji_mode",work_mode:"continue"};
// await this.senddatatoserilport(Command);
}
//自动模式
if (this.Devinfo.work_mode =="time_mode") {
let Command = {command: "set_work_mode",work_mode:"time_mode"};
await this.senddatatoserilport(Command);
Command = {command: "set_time_interval",time_interval:this.Devinfo.time_interval};
await this.senddatatoserilport(Command);
Command = {command: "set_start_time",start_time:this.coverstrtotime(this.Devinfo.start_time)};
await this.senddatatoserilport(Command);
Command = {command: "set_stop_time",stop_time:this.coverstrtotime(this.Devinfo.stop_time)};
await this.senddatatoserilport(Command);
}
if (this.Devinfo.work_mode =="advanced_mode") {
let Command = {command: "set_work_mode",work_mode:"advanced_mode"};
await this.senddatatoserilport(Command);
}
EventBus.emit("updatamaindevinfo");
eventBus.emit('showbox', {title: "工作模式", body: "设置工作模式成功",interval:10});
},
async senddatatoserilport(command){
let data = {
data: command,
datatype: "json"
}
await invoke("sendtoportAndgetreturn", data);
}
}
}
</script>
<template>
<div style="position: relative;width: 100%;height: 100%">
<div style="position:relative ;width: 60%;;margin: auto">
<b-input-group class="my-1">
<BInputGroupPrepend is-text class="myinputprepend">工作模式</BInputGroupPrepend>
<b-form-select v-model="Devinfo.work_mode" >
<b-form-select-option value="manual_mode">单次采集</b-form-select-option>
<b-form-select-option value="time_mode">自动采集</b-form-select-option>
<b-form-select-option value="advanced_mode">高级模式</b-form-select-option>
</b-form-select>
</b-input-group>
<b-input-group class="my-1" append="秒" v-if="Devinfo.work_mode!='advanced_mode'">
<BInputGroupPrepend is-text class="myinputprepend">采集间隔</BInputGroupPrepend>
<BFormInput type="number" id="input-none" :state="null" v-model="Devinfo.time_interval"/>
</b-input-group>
<b-input-group class="my-1" v-if="Devinfo.work_mode=='time_mode'">
<BInputGroupPrepend is-text class="myinputprepend">开始时间</BInputGroupPrepend>
<BFormInput type="time" id="input-none1" :state="null" v-model="Devinfo.start_time"/>
</b-input-group>
<b-input-group class="my-1" v-if="Devinfo.work_mode=='time_mode'">
<BInputGroupPrepend is-text class="myinputprepend">结束时间</BInputGroupPrepend>
<BFormInput type="time" id="input-none2" :state="null" v-model="Devinfo.stop_time"/>
</b-input-group>
</div>
<p style="position:absolute ;bottom: 10px;width: 100%;height: 30px">
<b-button @click="setWorkmode" style="position:absolute;right: 20px ">设置</b-button>
</p>
</div>
</template>
<style scoped>
.myinputprepend {
width: 120px;
}
</style>

72
src/components/mycard.vue Normal file
View File

@ -0,0 +1,72 @@
<script>
export default {
name: "mycard",
data(){
return {
isshowbody:true
}
},
props:{
datatoshow:{
type:Object,
default(){
return {
header:"header",
infolist:[{key:"key",value:"value"}]
}
}
}
}
}
</script>
<template>
<BCardGroup deck class="Devinfo1" size="sm">
<BCard no-body>
<BCardHeader header-tag="nav" style="position: relative">
<b>{{ datatoshow.header }}</b>
<button @click="isshowbody=!isshowbody" style="position: absolute;right: 5px" class="mybutton" >
<svg class="borow" v-show="isshowbody" viewBox="0 0 20 20" style="background-color: transparent;box-shadow:0 0 0;vertical-align: middle;"><path fill="black" d="M10.103 12.778L16.81 6.08a.69.69 0 0 1 .99.012a.726.726 0 0 1-.012 1.012l-7.203 7.193a.69.69 0 0 1-.985-.006L2.205 6.72a.727.727 0 0 1 0-1.01a.69.69 0 0 1 .99 0z"/></svg>
<svg class="borow" v-show="!isshowbody" viewBox="0 0 20 20" style="background-color: transparent"><path fill="black" d="M10.103 7.222c3.447 3.468 5.744 5.764 6.89 6.887c.198.185.539.56 1.046.07c.339-.327.325-.685-.039-1.073l-7.444-7.43a.638.638 0 0 0-.455-.176a.702.702 0 0 0-.472.176l-7.453 7.635c-.241.388-.231.715.03.98c.26.265.577.28.95.043z"/></svg>
</button>
</BCardHeader>
<BCardBody v-show="isshowbody" >
<p class="card-text devinfolist" v-show="isshowbody">
<b v-for="item in datatoshow.infolist" :key="item.key">{{item.key}}:{{item.value}}<br></b>
</p>
</BCardBody >
</BCard>
</BCardGroup>
</template>
<style scoped>
.Devinfo1{
left: 0px;
width: 100%;
user-select: none;
}
.mybutton{
height: 25px;
width: 25px;
padding: 0px;
background-color: transparent;
border: 0px;
}
.borow{
height: 25px;
width: 25px;
padding: 0px;
background-color: transparent;
border: 0px;
box-shadow:0 0 0;
}
</style>

View File

@ -0,0 +1,27 @@
const SerilporDefine = {
Datatype:{
DN:0x00,
Radiance:0x01,
Reflectance:0x03,
},
Derection:{
Up:0x00,
Down:0x01,
Dark_Up:0x02,
Dark_Down:0x03,
},
DataTypeforSend:{
ALLDN:0x00,
UpAndDownDN:0x01,
UpDN:0x02,
DOWNDN:0x03,
UpDarkDN:0x04,
DownDarkDN:0x05,
ALLRadiance:0x10,
UpAndDownRadiance:0x11,
UpRadiance:0x12,
DownRadiance:0x13
},
}
export default SerilporDefine;

View File

@ -0,0 +1,367 @@
<script>
import Siderleftmethode from "./siderleftmethod.js";
import siderleftSerilportMethod from "./SiderleftSerilportMethod.js";
import mycard from "./mycard.vue";
import {ref} from 'vue';
import Mycard from "./mycard.vue";
import EventBus from "../eventBus.js";
import {fs} from "@tauri-apps/api";
export default {
name: "siderleft",
components: {Mycard},
data() {
return {
isSpecialmodeshow: true,
dataprocessconfig:{
useSG:false,
usehighpass:false
},
outputconfig: {
isChongCaiyang: false,
ChongCaiyanginterval: 0.2,
},
caijiavgNumber:100,
autoremovedark: true,
caijidirection: "UP",
ShutterTime: [100, 100],
cajitimes: 5,
cajitimesjiange:0,
methodslist: [],
Comname: '请选择',
options: [],
datatosave: [],
Pathtosave: "",
nowNumber: 0,
Filename: "Plot",
pathofdir: "./data",
Devinfo: {
SerilNumber: "",
Version: "0000",
name: "暂无",
Caji_mode: "连续采集",
return_mode: "返回模式",
Datatype: "DN"
},
Datainfoshow: {
header: "数据信息",
infolist: []
},
iscollecting: false,
dataup: {},
datadown: {},
datainfoup: {
hasrecive: false,
header: "UP",
infolist: []
},
datainfodown: {
hasrecive: false,
header: "DOWN",
infolist: []
},
devinfoshow: {
header: "设备信息",
infolist: []
},
SerialInfo: {
isopen: false,
},
cssme: {
comportvariant: "info",
}
}
},
async mounted() {
var configdata=await fs.readTextFile("config.json");
configdata=JSON.parse(configdata)
if (typeof(configdata.pathofsave)!="undefined")
this.pathofdir=configdata.pathofsave
if (typeof(configdata.Filename)!="undefined")
this.Filename=configdata.Filename
if (typeof(configdata.caijiavgNumber)!="undefined")
this.caijiavgNumber=configdata.caijiavgNumber
if (typeof(configdata.useSG)!="undefined")
this.dataprocessconfig.useSG=configdata.useSG
if (typeof(configdata.usehighpass)!="undefined")
this.dataprocessconfig.usehighpass=configdata.usehighpass
var ports = this.listSerialPorts();
// let btn=document.getElementById("closecomeside");
// btn.disabled=true;
console.log(ports);
// var btnn = document.getElementById("closecome");
// btnn.disabled = true;
this.findmaxNinpath(this.pathofdir);
window.addEventListener("keydown", this.handlekeydown)
EventBus.on("updatamaindevinfo", this.GetSenSorInfo);
EventBus.on("konamiactive",this.setspectralmode);
EventBus.on("Get_Dev_Info",this.get_dev_info)
},
methods: {
...Siderleftmethode,
...siderleftSerilportMethod
},
setup(props, context) {
const optionName = ref('')
const isAdding = ref(false)
const onAddOption = () => {
isAdding.value = true
}
const clear = () => {
optionName.value = ''
isAdding.value = false
}
return {
optionName,
isAdding,
onAddOption,
clear,
}
},
}
</script>
<template>
<BAccordion class="bAccordionme" size="sm" >
<BAccordionItem title="高级设置" v-show="isSpecialmodeshow">
<!-- <b-input-group prepend="平均次数" size="sm" style="width: 100%">-->
<!-- <b-form-input type="number" v-model="caijiavgNumber"></b-form-input>-->
<!-- <b-input-group-append>-->
<!-- </b-input-group-append>-->
<!-- </b-input-group>-->
<!-- <b-input-group prepend="滤波" size="sm">-->
<!-- <div style="margin: auto; margin-left: 10px;">SG<input type="checkbox" v-model="dataprocessconfig.useSG" ></div>-->
<!-- <div style="margin: auto; margin-left: 10px;"> HighPass<input type="checkbox" v-model="dataprocessconfig.usehighpass" ></div>-->
<!-- </b-input-group>-->
<b-input-group prepend="aa" size="sm" style="width: 100%">
<b-form-input type="number" v-model="caijiavgNumber"></b-form-input>
<b-input-group-append>
</b-input-group-append>
</b-input-group>
<b-input-group prepend="bb" size="sm">
<div style="margin: auto; margin-left: 10px;"><input type="checkbox" v-model="dataprocessconfig.useSG" ></div>
<div style="margin: auto; margin-left: 10px;"><input type="checkbox" v-model="dataprocessconfig.usehighpass" ></div>
</b-input-group>
<b-button @click="saveconfig" variant="light" size="sm">保存</b-button>
</BAccordionItem>
<BAccordionItem title="控制" visible >
<b-input-group append="ms" v-if="Devinfo.work_mode=='advanced_mode'"
style="margin-bottom: 2px;width: 100%;margin-left: auto;margin-right: auto" size="sm">
<b-input-group-prepend>
<b-button style="min-width:80px" :disabled="iscollecting || !SerialInfo.isopen" @click="Dingbiao_OPT">OPT
</b-button>
</b-input-group-prepend>
<b-form-input v-model="ShutterTime[0]" type="text" :disabled="iscollecting || !SerialInfo.isopen"
v-show="caijidirection!='DOWN'"></b-form-input>
<b-form-input v-model="ShutterTime[1]" type="text" :disabled="iscollecting || !SerialInfo.isopen"
v-show="caijidirection=='DOWN'||caijidirection=='ALL'"></b-form-input>
</b-input-group>
<b-input-group style="margin-bottom: 2px;width: 100%;margin-left: auto;margin-right: auto" size="sm">
<b-button @click="GetoneData" :disabled="iscollecting || !SerialInfo.isopen" style="min-width:80px">
快速展示
<!-- 单次采集-->
</b-button>
<!-- <select v-model="caijidirection" v-if="Devinfo.work_mode=='advanced_mode'" :disabled="iscollecting || !SerialInfo.isopen"-->
<!-- style="margin-left: auto;margin-right: auto;padding:0px">-->
<!-- <option value="UP">UP</option>-->
<!-- <option value="DOWN">DOWN</option>-->
<!-- <option value="DARK">DARK</option>-->
<!-- <option value="ALL">ALL</option>-->
<!-- </select>-->
<b-form-select v-model="caijidirection" v-if="Devinfo.work_mode=='advanced_mode'"
:disabled="iscollecting || !SerialInfo.isopen"
style="padding-right: 8px">
<b-form-select-option value="UP">UP </b-form-select-option>
<b-form-select-option value="DOWN">DOWN</b-form-select-option>
<b-form-select-option value="DARK">DARK</b-form-select-option>
<b-form-select-option value="ALL">ALL</b-form-select-option>
</b-form-select>
<b-input-group-prepend is-text style="padding: 0px;padding-right: 6px;padding-left: 10px" v-if="Devinfo.work_mode=='advanced_mode'" >
<div style="font-size:8px;margin: 0px;padding: 0px;position: relative;top:0px" ><div>R_D</div>
<input type="checkbox" style="height: 12px;width: 12px" v-model="autoremovedark"/>
</div></b-input-group-prepend>
</b-input-group>
<b-input-group append=" 次" style="margin-bottom: 2px;width: 100%;margin-left: auto;margin-right: auto" size="sm">
<b-input-group-prepend>
<b-button @click="ContinueCelect(cajitimes)" :disabled="iscollecting || !SerialInfo.isopen"
style="min-width:80px">
保存数据
<!-- 连续采集-->
</b-button>
</b-input-group-prepend>
<b-form-input v-model="cajitimes" type="number" :disabled="iscollecting || !SerialInfo.isopen"></b-form-input>
</b-input-group>
<b-input-group append="秒" size="sm">
<b-input-group-prepend style="margin-bottom: 2px;width: 100%;margin-left: auto;margin-right: auto">
<b-input-group-text style="min-width:80px">保存间隔</b-input-group-text>
</b-input-group-prepend>
<b-form-input type="number" v-model="cajitimesjiange" :disabled="iscollecting || !SerialInfo.isopen"></b-form-input>
</b-input-group>
</BAccordionItem>
<BAccordionItem title="保存配置" >
<div>
<!-- <b-button @click="closemain" id="closecome" variant="light" >退出</b-button>-->
<b-input-group prepend="保存名称" size="sm" style="width: 100%">
<b-form-input type="text" v-model="Filename"></b-form-input>
</b-input-group>
<b-input-group prepend="保存路径" size="sm">
<b-form-input type="text" v-model="Pathtosave"></b-form-input>
<b-input-group-append>
<b-button @click="choosesavepath">...</b-button>
</b-input-group-append>
</b-input-group>
<b-input-group prepend="重 采 样 " size="sm">
<b-form-input type="number" max="10" min="0.05" step="0.05" v-model="outputconfig.ChongCaiyanginterval"></b-form-input>
<b-input-group-append>
<input type="checkbox" style="margin: 10px" v-model="outputconfig.isChongCaiyang"/>
</b-input-group-append>
</b-input-group>
</div>
</BAccordionItem>
</BAccordion>
<!-- <VueDragResize :isActive="true" :h="10">-->
<!-- -->
<!-- </VueDragResize>-->
<div class="buttom">
<b-button-group size="sm" style="width: 100%">
<BDropdown dropup :text="Comname" :variant="cssme.comportvariant" class="me-2" size="sm"
style="max-width: 30%; --bs-dropdown-min-width: 30%;font-size: xx-small" id="selectitem">
<BDropdownItem v-for="item in options" @click="Comname=item.value" style=" --bs-dropdown-min-width: 10px;"
variant="success" size="sm">
{{ item.label }}
</BDropdownItem>
</BDropdown>
<BButton @click="initserialport" id="opencom" variant="light" size="sm"
style="font-size: xx-small;max-width: 30%;">打开串口
</BButton>
<BButton @click="closecomport" id="closecomeside" variant="light" size="sm"
style="font-size: xx-small;max-width: 30%;">关闭串口
</BButton>
</b-button-group>
</div>
<div class="Devinfo" >
<!-- <mycard v-if="datainfoup.hasrecive" :datatoshow="datainfoup" style="margin-bottom: 2px"></mycard>-->
<!-- <mycard v-if="datainfodown.hasrecive" :datatoshow="datainfodown" style="margin-bottom: 2px"></mycard>-->
<!-- // <mycard v-show="SerialInfo.isopen" :datatoshow="devinfoshow"></mycard>-->
</div>
<!-- <Draggable style=" position: fixed; bottom: 120px;left: 0px;min-width: 14vw" >-->
<!-- <div style=" z-index: 10; " >-->
<!-- <mycard v-if="datainfoup.hasrecive" :datatoshow="datainfoup" style="margin-bottom: 2px"></mycard>-->
<!-- </div>-->
<!-- </Draggable>-->
<!-- <Draggable style=" position: fixed; bottom: 80px;left: 0px; min-width: 14vw" >-->
<!-- <div style=" z-index: 10; " >-->
<!-- <mycard v-if="datainfodown.hasrecive" :datatoshow="datainfodown" style="margin-bottom: 2px"></mycard>-->
<!-- </div>-->
<!-- </Draggable>-->
<Draggable style=" position: fixed; bottom: 40px;left: 0px;min-width: 14vw" >
<div style=" z-index: 10; " >
<mycard v-if="datainfoup.hasrecive" :datatoshow="datainfoup" style="margin-bottom: 2px"></mycard>
<mycard v-if="datainfodown.hasrecive" :datatoshow="datainfodown" style="margin-bottom: 2px"></mycard>
<mycard v-show="SerialInfo.isopen" :datatoshow="devinfoshow"></mycard>
</div>
</Draggable>
</template>
<style scoped>
.buttom {
position: absolute;
bottom: 20px;
left: 20px;
height: 20px;
width: 95%;
}
.Devinfo {
position: absolute;
bottom: 40px;
left: 0px;
width: 100%;
user-select: none;
}
.devinfolist {
text-align: left;
}
el-option {
font-size: 5px;
}
.dropdown-menu {
--bs-dropdown-min-width: 10rem;
}
:root {
--bs-dropdown-min-width: 100px; /* 设置下拉菜单的最小宽度为200px */
user-select: none;
}
.bAccordionme {
user-select: none;
radio: 0px;
}
</style>

View File

@ -0,0 +1,383 @@
import {dialog, fs} from "@tauri-apps/api";
import {invoke} from "@tauri-apps/api/tauri";
import * as echarts from "echarts";
import {exit} from "@tauri-apps/api/process";
import EventBus from "../eventBus.js";
import eventBus from "../eventBus.js";
export default {
async saveconfig(){
var configdata=await fs.readTextFile("./config.json");
configdata=JSON.parse(configdata);
configdata.Filename=this.Filename;
configdata.pathofsave=this.pathofdir;
configdata.caijiavgNumber=this.caijiavgNumber;
configdata.useSG=this.dataprocessconfig.useSG;
configdata.usehighpass=this.dataprocessconfig.usehighpass;
fs.writeFile("config.json", JSON.stringify(configdata));
EventBus.emit('showbox', {title: "系统", body: "保存配置成功",interval:10});
this.isSpecialmodeshow=false;
},
async choosesavepath(){
// var path = require('path');
// var dialog = require('@electron/remote').dialog;
// this.pathofdir= dialog.showOpenDialogSync({
// title: "请选择保存路径",
// properties: ['openDirectory'],
// })[0];
var options= {
defaultPath: "../",
directory: true,
title: "请选择保存路径",
}
this.pathofdir=await dialog.open(options);
var configdata=await fs.readTextFile("./config.json");
configdata=JSON.parse(configdata);
configdata.Filename=this.Filename;
configdata.pathofsave=this.pathofdir;
fs.writeFile("config.json", JSON.stringify(configdata));
var maxn=await this.findmaxNinpath(this.pathofdir);
this.Pathtosave=this.pathofdir+"/"+this.Filename+this.nowNumber+".csv";
},
createAndDownloadFile(fileName, content) {
// 创建一个 a 标签
var aTag = document.createElement('a');
// 创建一个 Blob 对象
var blob = new Blob([content]);
// 设置下载的文件名
aTag.download = fileName;
// 创建一个临时的 URL 指向 Blob 对象
aTag.href = URL.createObjectURL(blob);
// 模拟 a 标签的点击事件,触发下载
aTag.click();
// 释放创建的临时 URL 资源
URL.revokeObjectURL(blob);
},
async ContinueCelect(times){
for (var i=0;i<times;i++)
{
await this.GetoneData("",Number(this.caijiavgNumber));
var aa={
code:"Space"
}
await this.handlekeydown(aa);
await delay(50);
if (this.cajitimesjiange>0)
await delay(this.cajitimesjiange*1000-50);
}
EventBus.emit('showbox', {title: "系统", body: "采集"+times+"次数据完成",interval:10});
},
async handlekeydown(event){
// console.log(event.code)
if (event.code=="Space"){
if(this.iscollecting) {
eventBus.emit('showbox', {title: "系统", body: "正在采集数据,请稍后再试",interval:10});
return
}
//datatosave 保存
console.log(this.datatosave)
var data={};
if (this.caijidirection=="UP"||this.caijidirection=="DARK")
{
data =this.dataup;
}else {
data =this.datadown;
}
var lenthofdataup=data.data.length;
let coeffweave1=this.Devinfo.bochangxishu.a0;
let coeffweave2=this.Devinfo.bochangxishu.a1;
let coeffweave3=this.Devinfo.bochangxishu.a2;
let coeffweave4=this.Devinfo.bochangxishu.a3;
var strcsv=""
var strchogncaiyang="";
var xValues = []
for (var i=0;i<lenthofdataup;i++)
{
var weave=coeffweave1*i*i*i+coeffweave2*i*i+coeffweave3*i+coeffweave4;
xValues.push(weave);
}
var lenth=xValues.length;
var yValues = []
var yvalues2=[];
if (this.Devinfo.work_mode!="advanced_mode"||this.caijidirection=="ALL")
{
var dataup=this.dataup;
var datadown=this.datadown;
strcsv+="Weavelenth,upDN,downDN,upshutter,"+dataup.shutter_time
+",downshutter,"+datadown.shutter_time+",index"+dataup.index+"\r\n";
strchogncaiyang="Weavelenth,upDN,downDN,upshutter,"+dataup.shutter_time+",downshutter,"+datadown.shutter_time+",index"+dataup.index+"\r\n";
var lenthofdataup=dataup.data.length;
for (var i=0;i<lenthofdataup;i++)
{
yValues.push(dataup.data[lenthofdataup-i-1]);
yvalues2.push(datadown.data[lenthofdataup-i-1]);
}
if (this.outputconfig.isChongCaiyang)
{
let aaa= await invoke("interpolate_spline",{x:xValues,y:yValues,step:this.outputconfig.ChongCaiyanginterval})
let bbb= await invoke("interpolate_spline",{x:xValues,y:yvalues2,step:this.outputconfig.ChongCaiyanginterval})
var lenthofdataup=aaa.length;
for (var i=0;i<lenthofdataup;i++)
{
strchogncaiyang+=aaa[i]+","+bbb[i][1]+"\r\n";
}
}
for (var i=0;i<lenth;i++)
{
strcsv+=xValues[i]+","+yValues[i]+","+yvalues2[i]+"\r\n";
}
}
else
{
var datatosave={};
if (this.caijidirection=="UP")
{
datatosave=this.dataup;
strcsv+="Weavelenth,upDN,upshutter,"+this.dataup.shutter_time+",index"+this.dataup.index+"\r\n";
strchogncaiyang=strcsv;
}else if (this.caijidirection=="DOWN") {
datatosave=this.datadown;
strcsv+="Weavelenth,downDN,downshutter,"+this.datadown.shutter_time+",index"+this.datadown.index+"\r\n";
strchogncaiyang=strcsv;
} else if (this.caijidirection=="DARK") {
datatosave=this.dataup;
strcsv+="Weavelenth,darkDN,darkshutter,"+this.dataup.shutter_time+",index"+this.dataup.index+"\r\n";
strchogncaiyang=strcsv;
}
var lenthofdataup=datatosave.data.length;
for (var i=0;i<lenthofdataup;i++)
{
yValues.push(datatosave.data[lenthofdataup-i-1]);
}
var yValuesofchongcaiyang = []
if (this.outputconfig.isChongCaiyang)
{
let aaa= await invoke("interpolate_spline",{x:xValues,y:yValues,step:this.outputconfig.ChongCaiyanginterval})
var lenthofdataup=aaa.length;
for (var i=0;i<lenthofdataup;i++)
{
strchogncaiyang+=aaa[i]+"\r\n";
}
}
for (var i=0;i<lenth;i++)
{
strcsv+=xValues[i]+","+yValues[i]+"\r\n";
}
}
if(this.Devinfo.work_mode=="advanced_mode")
{
if (this.outputconfig.isChongCaiyang)
{
await fs.writeFile(this.pathofdir+"/"+this.Filename+this.nowNumber+"_"+this.caijidirection+"_chongcaiyang.csv", strchogncaiyang)
}
await fs.writeFile(this.pathofdir+"/"+this.Filename+this.nowNumber+"_"+this.caijidirection+".csv", strcsv);
eventBus.emit('showbox', {title: "系统", body: "保存数据 "+ this.pathofdir+"/"+this.Filename+this.nowNumber+"_"+this.caijidirection+".csv OK",interval:10});
}else
{
await fs.writeFile(this.Pathtosave, strcsv);
eventBus.emit('showbox', {title: "系统", body: "保存数据 "+ this.Pathtosave+" OK",interval:10});
}
// fs.writeFileSync(this.Pathtosave, strcsv);
this.nowNumber++;
this.Pathtosave=this.pathofdir+"/"+this.Filename+this.nowNumber+".csv";
}
if (event.ctrlKey&&event.code=="KeyG")
{
this.dataprocessconfig.useSG=!this.dataprocessconfig.useSG;
EventBus.emit('showbox', {title: "系统", body: (this.dataprocessconfig.useSG?"Go":"G"),interval:10});
event.preventDefault();
}
if (event.ctrlKey&&event.code=="ArrowUp")
{
this.caijiavgNumber++;
EventBus.emit('showbox', {title: "系统", body: this.caijiavgNumber,interval:100});
}
if (event.ctrlKey&&event.code=="ArrowDown") {
if (this.caijiavgNumber>1) {
this.caijiavgNumber--;
EventBus.emit('showbox', {title: "系统", body: this.caijiavgNumber,interval:100});
}else {
EventBus.emit('showbox', {title: "系统", body: "must > 1",interval:100});
}
}
if (event.ctrlKey&&event.altKey&&event.code=="KeyS") {
EventBus.emit('showbox', {title: "系统", body: "保存配置",interval:10});
}
if (event.ctrlKey&&event.code=="KeyH") {
this.dataprocessconfig.usehighpass=!this.dataprocessconfig.usehighpass;
EventBus.emit('showbox', {title: "系统", body: (this.dataprocessconfig.usehighpass?"Ho":"H"),interval:10});
event.preventDefault();
}
},
async findmaxNinpath(directoryPath){
//
//判断文件夹是否存在
let isexits=await fs.exists(directoryPath);
if (!isexits) {
// 如果不存在则创建文件夹
await fs.createDir(directoryPath);
}
// 以同步模式读取目录下的所有文件名
const files = await fs.readDir(directoryPath);
// 过滤出以"aaabbb"开头并且以".csv"结尾的文件
const filteredFiles = files.filter(file => {
// console.log(file)
var aa = file.path.startsWith(directoryPath + "\\" + this.Filename);
var bb = file.path.endsWith('.csv');
return aa && bb;
}
// file.path.startsWith(directoryPath+"\\"+this.Filename) && file.path.endsWith('.csv')}
);
// 提取文件名中的N值
const NValues = filteredFiles.map(file => {
const match = file.name.match(new RegExp(`^${ this.Filename}(\\d+)\\.csv$`));
return match ? parseInt(match[1]) : null;
}).filter(value => value !== null);
var maxN = Math.max(...NValues);
this.nowNumber=maxN+1;
if (NValues.length === 0) {
// 如果没有匹配的文件,则返回-1
maxN=0;
this.nowNumber=maxN;
}
// 找到最大的N值
this.Pathtosave=this.pathofdir+"\\"+this.Filename+this.nowNumber+".csv";
return new Promise((resolve, reject) => {return maxN});
},
initChart() {
const chartDom = this.$refs.chart;
// chartDom.style.width = '100%';
// chartDom.style.height = '100%';
let chart = echarts.init(chartDom);
this.option = {
// ECharts 配置选项
xAxis: {
type: 'value',
boundaryGap: false,// 显示连续的刻度
min: 0,
max: 510,
dataZoom: [
{
type: 'inside', // 内置数据区域缩放
start: 0, // 初始缩放范围的起始位置0%
end: 100 // 初始缩放范围的结束位置100%
}
]
},
animation: false,
yAxis: {
type: 'value',
//min:0,
},
dataZoom: [
{
type: 'inside', // 内置数据区域缩放,包括滚轮缩放
xAxisIndex: [0], // 对应 x 轴
filterMode: 'none' // 不过滤数据
},
{
type: 'inside', // 内置数据区域缩放,包括滚轮缩放
yAxisIndex: [0], // 对应 y 轴
filterMode: 'none' // 不过滤数据
}
],
// legend: {
// data: ['曲线'], // 图例名称
// show: true ,// 显示图例
// //selectedMode: 'multiple', // 图例的选择模式。默认开启图例开关可选singlemultiple
// },
series: [
{
data: [[1, 150], [2, 230], [3, 224], [4, 218], [5, 135], [6, 147], [7, 260]], // 使用二维数组表示数据点的坐标
type: 'line',
symbol: 'none', // 不显示数据点
smooth: false, // 不使用平滑处理
step: 'start' // 设置 step 类型的起始位置
}
]
};
chart.setOption(this.option);
},
comboxchange() {
// console.log(this.Comname);
},
onConfirm(){
this.options.push({value:this.optionName,label:this.optionName,index:this.options.length})
},
async closemain(){
await exit(0);
},
async setspectralmode(){
this.isSpecialmodeshow=true
},
get_dev_info(){
return this.Devinfo
}
}
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}

5
src/eventBus.js Normal file
View File

@ -0,0 +1,5 @@
import mitt from 'mitt';
const EventBus = mitt();
export default EventBus;

54
src/main.js Normal file
View File

@ -0,0 +1,54 @@
import { createApp } from "vue";
import "./styles.css";
import App from "./AppHyperSpectral.vue";
import { appWindow } from '@tauri-apps/api/window';
import { LogicalSize } from '@tauri-apps/api/window';
import ElementPlus from 'element-plus';
import 'element-plus/dist/index.css'
import {createBootstrap} from 'bootstrap-vue-next'
//
// // Add the necessary CSS
import 'bootstrap/dist/css/bootstrap.css'
import 'bootstrap-vue-next/dist/bootstrap-vue-next.css'
import ArcoVue from '@arco-design/web-vue';
import '@arco-design/web-vue/dist/arco.css';
import { Draggable,DraggablePlugin, DraggableDirective } from '@braks/revue-draggable';
import KonamiCode from 'vue3-konami-code';
import EventBus from "./eventBus.js";
async function setWindowSize() {
// const primaryMonitor = await screen.primaryMonitor();
// const screenSize = primaryMonitor.size;
const newSize = new LogicalSize(800, 600);
await appWindow.setSize(newSize);
// appWindow.setSize(new Size(1000, 1000));
}
var app = createApp(App);
app.use(ElementPlus);
app.use(createBootstrap( {components: true, directives: true,plugins:true,icons: true,}));
app.use(ArcoVue);
app.use(DraggablePlugin);
app.use(KonamiCode, {
onKonamiCodeEntered: () => {
// 用户输入Konami Code后执行的代码
console.log('Konami Code 已输入!');
EventBus.emit('konamiactive');
}
});
// or
app.directive('draggable', DraggableDirective)
app.component('Draggable', Draggable);
// app.use(BootstrapVueIcons);
app.mount("#app");

114
src/styles.css Normal file
View File

@ -0,0 +1,114 @@
:root {
font-family: Inter, Avenir, Helvetica, Arial, sans-serif;
font-size: 16px;
line-height: 24px;
font-weight: 400;
color: #0f0f0f;
background-color: #f6f6f6;
font-synthesis: none;
text-rendering: optimizeLegibility;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
-webkit-text-size-adjust: 100%;
}
.container {
margin: 0;
padding-top: 10vh;
display: flex;
flex-direction: column;
justify-content: center;
text-align: center;
}
.logo {
height: 6em;
padding: 1.5em;
will-change: filter;
transition: 0.75s;
}
.logo.tauri:hover {
filter: drop-shadow(0 0 2em #24c8db);
}
.row {
display: flex;
justify-content: center;
}
a {
font-weight: 500;
color: #646cff;
text-decoration: inherit;
}
a:hover {
color: #535bf2;
}
h1 {
text-align: center;
}
input,
button {
border-radius: 8px;
border: 1px solid transparent;
padding: 0.6em 1.2em;
font-size: 1em;
font-weight: 500;
font-family: inherit;
color: #0f0f0f;
background-color: #ffffff;
transition: border-color 0.25s;
box-shadow: 0 2px 2px rgba(0, 0, 0, 0.2);
}
button {
cursor: pointer;
}
button:hover {
border-color: #396cd8;
}
button:active {
border-color: #396cd8;
background-color: #e8e8e8;
}
input,
button {
outline: none;
}
#app {
max-width: 3000px;
margin: 0 auto;
padding: 2rem;
text-align: center;
}
#greet-input {
margin-right: 5px;
}
@media (prefers-color-scheme: dark) {
:root {
color: #f6f6f6;
background-color: #2f2f2f;
}
a:hover {
color: #24c8db;
}
input,
button {
color: #ffffff;
background-color: #0f0f0f98;
}
button:active {
background-color: #0f0f0f69;
}
}