first
24
.gitignore
vendored
Normal file
@ -0,0 +1,24 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
pnpm-debug.log*
|
||||
lerna-debug.log*
|
||||
|
||||
node_modules
|
||||
dist
|
||||
dist-ssr
|
||||
*.local
|
||||
|
||||
# Editor directories and files
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
.idea
|
||||
.DS_Store
|
||||
*.suo
|
||||
*.ntvs*
|
||||
*.njsproj
|
||||
*.sln
|
||||
*.sw?
|
7
.vscode/extensions.json
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
{
|
||||
"recommendations": [
|
||||
"Vue.volar",
|
||||
"tauri-apps.tauri-vscode",
|
||||
"rust-lang.rust-analyzer"
|
||||
]
|
||||
}
|
7
README.md
Normal file
@ -0,0 +1,7 @@
|
||||
# Tauri + Vue 3
|
||||
|
||||
This template should help get you started developing with Tauri + Vue 3 in Vite. The template uses Vue 3 `<script setup>` SFCs, check out the [script setup docs](https://v3.vuejs.org/api/sfc-script-setup.html#sfc-script-setup) to learn more.
|
||||
|
||||
## Recommended IDE Setup
|
||||
|
||||
- [VS Code](https://code.visualstudio.com/) + [Volar](https://marketplace.visualstudio.com/items?itemName=Vue.volar) + [Tauri](https://marketplace.visualstudio.com/items?itemName=tauri-apps.tauri-vscode) + [rust-analyzer](https://marketplace.visualstudio.com/items?itemName=rust-lang.rust-analyzer)
|
33
index.html
Normal file
@ -0,0 +1,33 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<link rel="icon" type="image/svg+xml" href="/vite.svg" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
<title>Tauri + Vue 3 App</title>
|
||||
<style>
|
||||
html, body, #app {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
margin: 0;
|
||||
padding: 0;
|
||||
overflow: hidden;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
}
|
||||
.maingui {
|
||||
margin: 0px;
|
||||
}
|
||||
.accordion-button{
|
||||
padding: 0px;
|
||||
}
|
||||
</style>
|
||||
<script src="http://172.16.0.84:8098"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="app" class="maingui" style="padding: 0px"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
</body>
|
||||
</html>
|
5581
package-lock.json
generated
Normal file
38
package.json
Normal file
@ -0,0 +1,38 @@
|
||||
{
|
||||
"name": "SpectralPlot",
|
||||
"private": true,
|
||||
"version": "0.0.1",
|
||||
"type": "module",
|
||||
"scripts": {
|
||||
"dev": "vite",
|
||||
"build": "vite build",
|
||||
"preview": "vite preview",
|
||||
"tauri": "tauri"
|
||||
},
|
||||
"dependencies": {
|
||||
"@braks/revue-draggable": "^0.5.0",
|
||||
"@tauri-apps/api": "^1.5.3",
|
||||
"bootstrap": "^5.3.3",
|
||||
"bootstrap-vue-next": "^0.17.6",
|
||||
"clipboard": "^2.0.11",
|
||||
"echart": "^0.1.3",
|
||||
"echarts": "^5.4.3",
|
||||
"element-plus": "^2.4.4",
|
||||
"json-editor-vue3": "^1.1.1",
|
||||
"less": "^4.2.0",
|
||||
"mitt": "^3.0.1",
|
||||
"serialport": "^12.0.0",
|
||||
"vue": "^3.3.4",
|
||||
"vue-drag-resize": "^2.0.3",
|
||||
"vue-json-viewer": "^3.0.4",
|
||||
"vue3-json-editor": "^1.1.5",
|
||||
"vue3-konami-code": "^1.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@arco-design/web-vue": "^2.55.2",
|
||||
"@tauri-apps/cli": "^1.5.11",
|
||||
"@vitejs/plugin-vue": "^5.0.4",
|
||||
"unplugin-vue-components": "^0.27.0",
|
||||
"vite": "^5.0.0"
|
||||
}
|
||||
}
|
6
public/tauri.svg
Normal file
@ -0,0 +1,6 @@
|
||||
<svg width="206" height="231" viewBox="0 0 206 231" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||
<path d="M143.143 84C143.143 96.1503 133.293 106 121.143 106C108.992 106 99.1426 96.1503 99.1426 84C99.1426 71.8497 108.992 62 121.143 62C133.293 62 143.143 71.8497 143.143 84Z" fill="#FFC131"/>
|
||||
<ellipse cx="84.1426" cy="147" rx="22" ry="22" transform="rotate(180 84.1426 147)" fill="#24C8DB"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M166.738 154.548C157.86 160.286 148.023 164.269 137.757 166.341C139.858 160.282 141 153.774 141 147C141 144.543 140.85 142.121 140.558 139.743C144.975 138.204 149.215 136.139 153.183 133.575C162.73 127.404 170.292 118.608 174.961 108.244C179.63 97.8797 181.207 86.3876 179.502 75.1487C177.798 63.9098 172.884 53.4021 165.352 44.8883C157.82 36.3744 147.99 30.2165 137.042 27.1546C126.095 24.0926 114.496 24.2568 103.64 27.6274C92.7839 30.998 83.1319 37.4317 75.8437 46.1553C74.9102 47.2727 74.0206 48.4216 73.176 49.5993C61.9292 50.8488 51.0363 54.0318 40.9629 58.9556C44.2417 48.4586 49.5653 38.6591 56.679 30.1442C67.0505 17.7298 80.7861 8.57426 96.2354 3.77762C111.685 -1.01901 128.19 -1.25267 143.769 3.10474C159.348 7.46215 173.337 16.2252 184.056 28.3411C194.775 40.457 201.767 55.4101 204.193 71.404C206.619 87.3978 204.374 103.752 197.73 118.501C191.086 133.25 180.324 145.767 166.738 154.548ZM41.9631 74.275L62.5557 76.8042C63.0459 72.813 63.9401 68.9018 65.2138 65.1274C57.0465 67.0016 49.2088 70.087 41.9631 74.275Z" fill="#FFC131"/>
|
||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M38.4045 76.4519C47.3493 70.6709 57.2677 66.6712 67.6171 64.6132C65.2774 70.9669 64 77.8343 64 85.0001C64 87.1434 64.1143 89.26 64.3371 91.3442C60.0093 92.8732 55.8533 94.9092 51.9599 97.4256C42.4128 103.596 34.8505 112.392 30.1816 122.756C25.5126 133.12 23.9357 144.612 25.6403 155.851C27.3449 167.09 32.2584 177.598 39.7906 186.112C47.3227 194.626 57.153 200.784 68.1003 203.846C79.0476 206.907 90.6462 206.743 101.502 203.373C112.359 200.002 122.011 193.568 129.299 184.845C130.237 183.722 131.131 182.567 131.979 181.383C143.235 180.114 154.132 176.91 164.205 171.962C160.929 182.49 155.596 192.319 148.464 200.856C138.092 213.27 124.357 222.426 108.907 227.222C93.458 232.019 76.9524 232.253 61.3736 227.895C45.7948 223.538 31.8055 214.775 21.0867 202.659C10.3679 190.543 3.37557 175.59 0.949823 159.596C-1.47592 143.602 0.768139 127.248 7.41237 112.499C14.0566 97.7497 24.8183 85.2327 38.4045 76.4519ZM163.062 156.711L163.062 156.711C162.954 156.773 162.846 156.835 162.738 156.897C162.846 156.835 162.954 156.773 163.062 156.711Z" fill="#24C8DB"/>
|
||||
</svg>
|
After Width: | Height: | Size: 2.5 KiB |
1
public/vite.svg
Normal 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="31.88" height="32" preserveAspectRatio="xMidYMid meet" viewBox="0 0 256 257"><defs><linearGradient id="IconifyId1813088fe1fbc01fb466" x1="-.828%" x2="57.636%" y1="7.652%" y2="78.411%"><stop offset="0%" stop-color="#41D1FF"></stop><stop offset="100%" stop-color="#BD34FE"></stop></linearGradient><linearGradient id="IconifyId1813088fe1fbc01fb467" x1="43.376%" x2="50.316%" y1="2.242%" y2="89.03%"><stop offset="0%" stop-color="#FFEA83"></stop><stop offset="8.333%" stop-color="#FFDD35"></stop><stop offset="100%" stop-color="#FFA800"></stop></linearGradient></defs><path fill="url(#IconifyId1813088fe1fbc01fb466)" d="M255.153 37.938L134.897 252.976c-2.483 4.44-8.862 4.466-11.382.048L.875 37.958c-2.746-4.814 1.371-10.646 6.827-9.67l120.385 21.517a6.537 6.537 0 0 0 2.322-.004l117.867-21.483c5.438-.991 9.574 4.796 6.877 9.62Z"></path><path fill="url(#IconifyId1813088fe1fbc01fb467)" d="M185.432.063L96.44 17.501a3.268 3.268 0 0 0-2.634 3.014l-5.474 92.456a3.268 3.268 0 0 0 3.997 3.378l24.777-5.718c2.318-.535 4.413 1.507 3.936 3.838l-7.361 36.047c-.495 2.426 1.782 4.5 4.151 3.78l15.304-4.649c2.372-.72 4.652 1.36 4.15 3.788l-11.698 56.621c-.732 3.542 3.979 5.473 5.943 2.437l1.313-2.028l72.516-144.72c1.215-2.423-.88-5.186-3.54-4.672l-25.505 4.922c-2.396.462-4.435-1.77-3.759-4.114l16.646-57.705c.677-2.35-1.37-4.583-3.769-4.113Z"></path></svg>
|
After Width: | Height: | Size: 1.5 KiB |
7
src-tauri/.gitignore
vendored
Normal file
@ -0,0 +1,7 @@
|
||||
# Generated by Cargo
|
||||
# will have compiled files and executables
|
||||
/target/
|
||||
|
||||
# Generated by Tauri
|
||||
# will have schema files for capabilities auto-completion
|
||||
/gen/schemas
|
4354
src-tauri/Cargo.lock
generated
Normal file
36
src-tauri/Cargo.toml
Normal file
@ -0,0 +1,36 @@
|
||||
[package]
|
||||
name = "myfirst_tauri"
|
||||
version = "0.0.0"
|
||||
description = "A Tauri App"
|
||||
authors = ["you"]
|
||||
edition = "2021"
|
||||
|
||||
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||
|
||||
[build-dependencies]
|
||||
tauri-build = { version = "1", features = [] }
|
||||
|
||||
[dependencies]
|
||||
tauri = { version = "1", features = [ "process-all", "window-all", "dialog-all", "fs-all", "shell-open"] }
|
||||
serde = { version = "1", features = ["derive"] }
|
||||
serde_json = "1"
|
||||
serialport = "^4.3.0"
|
||||
lazy_static = "1.4"
|
||||
serde_derive = "1.0"
|
||||
serde_with = "1.11"
|
||||
savgol-rs = "0.1.0"
|
||||
splines = "4.3.1"
|
||||
ndarray = "0.15.6"
|
||||
ndarray-stats = "0.5.1"
|
||||
ndarray-ndimage = "0.4.0"
|
||||
find_peaks = "0.1.5"
|
||||
csv = "1.3.0"
|
||||
tklog = "0.0.8"
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
[features]
|
||||
# This feature is used for production builds or when a dev server is not specified, DO NOT REMOVE!!
|
||||
custom-protocol = ["tauri/custom-protocol"]
|
3
src-tauri/build.rs
Normal file
@ -0,0 +1,3 @@
|
||||
fn main() {
|
||||
tauri_build::build()
|
||||
}
|
BIN
src-tauri/calibratefile/downgain.bin
Normal file
BIN
src-tauri/calibratefile/upgain.bin
Normal file
1
src-tauri/config.json
Normal file
@ -0,0 +1 @@
|
||||
{"pathofsave":"D:\\01Hydata\\123123123\\test2","Filename":"test","caijiavgNumber":"1","useSG":false,"usehighpass":true}
|
BIN
src-tauri/icons/1.jpg
Normal file
After Width: | Height: | Size: 598 KiB |
BIN
src-tauri/icons/128x128.png
Normal file
After Width: | Height: | Size: 3.4 KiB |
BIN
src-tauri/icons/128x128@2x.png
Normal file
After Width: | Height: | Size: 6.8 KiB |
BIN
src-tauri/icons/32x32.png
Normal file
After Width: | Height: | Size: 974 B |
BIN
src-tauri/icons/Square107x107Logo.png
Normal file
After Width: | Height: | Size: 2.8 KiB |
BIN
src-tauri/icons/Square142x142Logo.png
Normal file
After Width: | Height: | Size: 3.8 KiB |
BIN
src-tauri/icons/Square150x150Logo.png
Normal file
After Width: | Height: | Size: 3.9 KiB |
BIN
src-tauri/icons/Square284x284Logo.png
Normal file
After Width: | Height: | Size: 7.6 KiB |
BIN
src-tauri/icons/Square30x30Logo.png
Normal file
After Width: | Height: | Size: 903 B |
BIN
src-tauri/icons/Square310x310Logo.png
Normal file
After Width: | Height: | Size: 8.4 KiB |
BIN
src-tauri/icons/Square44x44Logo.png
Normal file
After Width: | Height: | Size: 1.3 KiB |
BIN
src-tauri/icons/Square71x71Logo.png
Normal file
After Width: | Height: | Size: 2.0 KiB |
BIN
src-tauri/icons/Square89x89Logo.png
Normal file
After Width: | Height: | Size: 2.4 KiB |
BIN
src-tauri/icons/StoreLogo.png
Normal file
After Width: | Height: | Size: 1.5 KiB |
BIN
src-tauri/icons/icon.icns
Normal file
BIN
src-tauri/icons/icon.ico
Normal file
After Width: | Height: | Size: 85 KiB |
BIN
src-tauri/icons/icon.png
Normal file
After Width: | Height: | Size: 14 KiB |
BIN
src-tauri/my_struct.bin
Normal file
28
src-tauri/src/algorithm/mod.rs
Normal file
@ -0,0 +1,28 @@
|
||||
mod smoothmethod;
|
||||
mod spectraltools;
|
||||
mod sharpmethod;
|
||||
|
||||
|
||||
#[tauri::command]
|
||||
pub fn interpolate_spline(x: Vec<f64>, y: Vec<f64>, step: f64) ->Vec<(f64, f64)>{
|
||||
spectraltools::interpolate_spline(x, y, step).unwrap()
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn interpolate_spline_at_points(x: Vec<f64>, y: Vec<f64>, x_target: Vec<f64>) -> Vec<f64>{
|
||||
spectraltools::interpolate_spline_at_points(x, y, x_target).unwrap()
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn sg_smooth(data: Vec<f64>, window: usize, order: usize) -> Vec<f64> {
|
||||
smoothmethod::savgol(data, window, order)
|
||||
}
|
||||
#[tauri::command]
|
||||
pub fn Gaussian_filter_high(data: Vec<f64>, sigma: f64) -> Vec<f64> {
|
||||
sharpmethod::high_pass_gaussian_filter(data, sigma)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
pub fn find_peek(data: Vec<f64>, minheigh: f64) -> Vec<(u32, f64)> {
|
||||
spectraltools::find_peek(data, minheigh)
|
||||
}
|
42
src-tauri/src/algorithm/sharpmethod.rs
Normal file
@ -0,0 +1,42 @@
|
||||
extern crate ndarray;
|
||||
extern crate ndarray_ndimage;
|
||||
|
||||
use ndarray::prelude::*;
|
||||
use ndarray_ndimage::{gaussian_filter, BorderMode};
|
||||
|
||||
pub fn high_pass_gaussian_filter(input: Vec<f64>, sigma: f64) -> Vec<f64> {
|
||||
// 将输入 Vec<f64> 转换为 Array1<f64>
|
||||
let mut input_array = Array1::from_vec(input);
|
||||
// for i in 0..input_array.len(){
|
||||
//
|
||||
// input_array[i]=input_array[i]*input_array[i]/( 65535f64);
|
||||
// }
|
||||
// return input_array.to_vec();
|
||||
|
||||
|
||||
|
||||
// 高斯低通滤波
|
||||
let mut low_pass = gaussian_filter(&input_array, sigma, 0, BorderMode::Reflect, 3);
|
||||
// Modify the result: set values less than zero to zero
|
||||
println!("{:?}",low_pass);
|
||||
// 高通滤波:原始信号 - 低通滤波结果
|
||||
let mut addarry=&input_array - &low_pass;
|
||||
for i in 0..addarry.len(){
|
||||
if addarry[i] < 0.0 {
|
||||
addarry[i] = 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
let high_pass =&input_array+ &addarry;
|
||||
|
||||
// 找到原始数据和锐化后数据的最大值
|
||||
let max_original = input_array.iter().cloned().fold(f64::MIN, f64::max);
|
||||
let max_sharpened = high_pass.iter().cloned().fold(f64::MIN, f64::max);
|
||||
|
||||
// 计算系数
|
||||
let coefficient = max_original / max_sharpened;
|
||||
|
||||
// 应用系数并将输出 Array1<f64> 转换回 Vec<f64>
|
||||
high_pass.map(|&x| x * coefficient).to_vec()
|
||||
}
|
23
src-tauri/src/algorithm/smoothmethod.rs
Normal file
@ -0,0 +1,23 @@
|
||||
extern crate savgol_rs;
|
||||
|
||||
|
||||
use savgol_rs::savgol_filter;
|
||||
pub fn savgol(data: Vec<f64>, window: usize, order: usize) -> Vec<f64> {
|
||||
let svinput= savgol_rs::SavGolInput{data:&data,window_length:window,poly_order:order,derivative:0};
|
||||
|
||||
savgol_filter(&svinput).unwrap()
|
||||
}
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_savgol() {
|
||||
// 示例数据
|
||||
let data = vec![1.0, 1.9, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0];
|
||||
let window = 5;
|
||||
let order = 2;
|
||||
|
||||
// 调用 savgol 函数
|
||||
let smoothed_data = savgol(data.clone(), window, order);
|
||||
println!("Smoothed data: {:?}", smoothed_data);
|
||||
|
||||
}
|
140
src-tauri/src/algorithm/spectraltools.rs
Normal file
@ -0,0 +1,140 @@
|
||||
extern crate splines;
|
||||
|
||||
use splines::{Spline, Key, Interpolation};
|
||||
use std::error::Error;
|
||||
|
||||
use find_peaks::PeakFinder;
|
||||
|
||||
pub fn interpolate_spline<T: Copy + Into<f64>,>(x_T: Vec<T>, y_T: Vec<T>, step: f64) -> Result<Vec<(f64, f64)>, Box<dyn Error>> {
|
||||
let x: Vec<f64> = x_T.iter().map(|&x| x.into()).collect();
|
||||
let y: Vec<f64> = y_T.iter().map(|&y| y.into()).collect();
|
||||
|
||||
if x.len() != y.len() {
|
||||
return Err("x and y must have the same length".into());
|
||||
}
|
||||
|
||||
// 创建样条曲线
|
||||
let keys: Vec<Key<f64, f64>> = x.iter()
|
||||
.zip(y.iter())
|
||||
.map(|(&x, &y)| Key::new(x, y, Interpolation::Linear))
|
||||
.collect();
|
||||
|
||||
let spline = Spline::from_vec(keys);
|
||||
|
||||
// 计算 x 的最大值和最小值
|
||||
let &start = x.iter().min_by(|a, b| a.partial_cmp(b).unwrap()).unwrap();
|
||||
let &end = x.iter().max_by(|a, b| a.partial_cmp(b).unwrap()).unwrap();
|
||||
|
||||
// 插值到间隔为 step 的点
|
||||
let mut result = Vec::new();
|
||||
let mut t = start;
|
||||
|
||||
while t <= end {
|
||||
if let Some(value) = spline.clamped_sample(t) {
|
||||
result.push((t, value));
|
||||
}
|
||||
t += step;
|
||||
}
|
||||
|
||||
Ok(result)
|
||||
}
|
||||
|
||||
pub fn interpolate_spline_at_points<T: Copy + Into<f64>>(x_T: Vec<T>, y_T: Vec<T>, x_target: Vec<f64>) -> Result<Vec<(f64)>, Box<dyn Error>> {
|
||||
let x: Vec<f64> = x_T.iter().map(|&x| x.into()).collect();
|
||||
let y: Vec<f64> = y_T.iter().map(|&y| y.into()).collect();
|
||||
|
||||
if x.len() != y.len() {
|
||||
return Err("x and y must have the same length".into());
|
||||
}
|
||||
|
||||
// 创建样条曲线
|
||||
let keys: Vec<Key<f64, f64>> = x.iter()
|
||||
.zip(y.iter())
|
||||
.map(|(&x, &y)| Key::new(x, y, Interpolation::Linear))
|
||||
.collect();
|
||||
|
||||
let spline = Spline::from_vec(keys);
|
||||
|
||||
// 插值到 x_target 指定的点
|
||||
let mut result = Vec::new();
|
||||
|
||||
for &t in x_target.iter() {
|
||||
if let Some(value) = spline.clamped_sample(t) {
|
||||
result.push(value);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(result)
|
||||
}
|
||||
pub fn find_peek(data:Vec<f64>,minheigh:f64)->Vec<(u32,f64)>{
|
||||
let mut fp = PeakFinder::new(&data);
|
||||
fp.with_min_prominence(200.);
|
||||
fp.with_min_height(minheigh);
|
||||
let mut retvec=Vec::new();
|
||||
let peaks = fp.find_peaks();
|
||||
for p in peaks {
|
||||
// println!("{} {}", p.middle_position(), p.height.unwrap());
|
||||
retvec.push((p.middle_position().try_into().unwrap(),p.height.unwrap()));
|
||||
|
||||
}
|
||||
retvec
|
||||
}
|
||||
|
||||
|
||||
#[test]
|
||||
fn testinterpolate_spline() -> Result<(), Box<dyn Error>> {
|
||||
// 示例数据
|
||||
let x = vec![0.0,0.5, 0.569, 1.138, 1.707, 2.276, 2.845];
|
||||
let y = vec![0.0, 0.4,0.5, 1.0, 0.5, 0.0, -0.5];
|
||||
let step = 0.1;
|
||||
|
||||
// 调用插值函数
|
||||
let interpolated_values = interpolate_spline(x, y, step)?;
|
||||
|
||||
// 输出结果
|
||||
for (xi, yi) in interpolated_values {
|
||||
println!("x = {:.3}, y = {:.3}", xi, yi);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
#[test]
|
||||
fn tset_interpolate_spline_at_points() -> Result<(), Box<dyn Error>> {
|
||||
let x = vec![0.0,0.5, 0.569, 1.138, 1.707, 2.276, 2.845];
|
||||
let y = vec![0.0, 0.4,0.5, 1.0, 0.5, 0.0, -0.5];
|
||||
let x_target = vec![0.1, 0.2, 0.3];
|
||||
|
||||
let result = interpolate_spline_at_points(x, y, x_target)?;
|
||||
|
||||
for (yi) in result {
|
||||
println!("y = {:.3}", yi);
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
use csv::ReaderBuilder;
|
||||
fn read_csv_to_vec(file_path: &str) -> Result<Vec<f64>, Box<dyn Error>> {
|
||||
let mut rdr = ReaderBuilder::new().from_path(file_path)?;
|
||||
let mut values = Vec::new();
|
||||
|
||||
for result in rdr.records() {
|
||||
let record = result?;
|
||||
if let Some(value) = record.get(1) {
|
||||
values.push(value.parse::<f64>()?);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(values)
|
||||
}
|
||||
|
||||
|
||||
|
||||
#[test]
|
||||
fn test_find_peek(){
|
||||
let data = read_csv_to_vec("D:\\06Learn\\rust\\tarui\\myfirst_tauri\\src-tauri\\test0_UP.csv").unwrap();
|
||||
let peaks = find_peek(data,10000.0);
|
||||
for p in peaks {
|
||||
println!("{} {}", p.0, p.1);
|
||||
}
|
||||
}
|
471
src-tauri/src/main.rs
Normal file
@ -0,0 +1,471 @@
|
||||
// Prevents additional console window on Windows in release, DO NOT REMOVE!!
|
||||
#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")]
|
||||
use core::str;
|
||||
use serialport::new;
|
||||
use std::ffi::c_float;
|
||||
use std::fmt::format;
|
||||
use std::fs;
|
||||
use std::fs::File;
|
||||
use std::io::{self, Read, Write};
|
||||
// use std::sync::WaitTimeoutResult;
|
||||
use std::path::Path;
|
||||
mod algorithm;
|
||||
mod mylog;
|
||||
mod serport;
|
||||
use algorithm::interpolate_spline;
|
||||
use algorithm::sg_smooth;
|
||||
use std::mem;
|
||||
|
||||
use mylog::*;
|
||||
use serde::{Deserialize, Serialize};
|
||||
use serde_with::serde_as;
|
||||
use serport::serport::*;
|
||||
|
||||
#[derive(Serialize, Deserialize)]
|
||||
struct RetStruct {
|
||||
datatype: u8,
|
||||
content: String,
|
||||
data: IS11DataStruct,
|
||||
}
|
||||
#[serde_as]
|
||||
#[derive(Serialize, Deserialize)]
|
||||
#[repr(C)]
|
||||
struct IS11DataStruct {
|
||||
datatype: u8, // Using r# to allow the use of the keyword 'type'
|
||||
direction: u8,
|
||||
tuigan_stat: u8,
|
||||
shutter_time: u32,
|
||||
index: u64,
|
||||
temprature: [f32; 8],
|
||||
#[serde_as(as = "[_; 2048]")]
|
||||
data: [f32; 2048],
|
||||
}
|
||||
impl Default for IS11DataStruct {
|
||||
fn default() -> Self {
|
||||
IS11DataStruct {
|
||||
datatype: 0,
|
||||
direction: 10,
|
||||
tuigan_stat: 0,
|
||||
shutter_time: 0,
|
||||
index: 0,
|
||||
temprature: [0.0; 8],
|
||||
data: [0.0; 2048],
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn savecalibratefile(Gain: Vec<f32>, shutter: u32, direction: bool, filepath: String) -> String {
|
||||
let mut data = IS11DataStruct::default();
|
||||
data.data = Gain.as_slice().try_into().unwrap();
|
||||
data.shutter_time = shutter as u32;
|
||||
data.direction = if direction { 1 } else { 0 };
|
||||
data.datatype = 0x04;
|
||||
let mut buffer = vec![0u8; mem::size_of::<IS11DataStruct>()];
|
||||
|
||||
// 序列化为二进制数据
|
||||
unsafe {
|
||||
let ptr = &data as *const IS11DataStruct as *const u8;
|
||||
std::ptr::copy_nonoverlapping(ptr, buffer.as_mut_ptr(), mem::size_of::<IS11DataStruct>());
|
||||
}
|
||||
// 序列化为二进制数据
|
||||
let file_path = Path::new(&filepath);
|
||||
|
||||
// 获取文件路径的父目录
|
||||
if let Some(parent) = file_path.parent() {
|
||||
// 确保父目录存在
|
||||
if !parent.exists() {
|
||||
fs::create_dir_all(parent).unwrap();
|
||||
println!("父目录已创建: {:?}", parent);
|
||||
} else {
|
||||
println!("父目录已存在: {:?}", parent);
|
||||
}
|
||||
} else {
|
||||
println!("文件路径没有父目录");
|
||||
}
|
||||
let mut file = File::create(filepath).unwrap();
|
||||
file.write_all(&buffer).unwrap();
|
||||
|
||||
"OK".to_string()
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn sendcalibratetodev(Gain: Vec<f32>, shutter: u32, direction: bool) -> String {
|
||||
let mut data = IS11DataStruct::default();
|
||||
data.data = Gain.as_slice().try_into().unwrap();
|
||||
data.shutter_time = shutter as u32;
|
||||
data.direction = if direction { 1 } else { 0 };
|
||||
data.datatype = 0x04;
|
||||
let mut buffer = vec![0u8; mem::size_of::<IS11DataStruct>()];
|
||||
// 序列化为二进制数据
|
||||
unsafe {
|
||||
let ptr = &data as *const IS11DataStruct as *const u8;
|
||||
std::ptr::copy_nonoverlapping(ptr, buffer.as_mut_ptr(), mem::size_of::<IS11DataStruct>());
|
||||
}
|
||||
sendtoportbinary(buffer, 0x03);
|
||||
"OK".to_string()
|
||||
}
|
||||
|
||||
fn sendtoportbinary(data: Vec<u8>, command: u8) -> String {
|
||||
let lenth = data.len() as u16;
|
||||
let high: u8 = (lenth >> 8) as u8;
|
||||
let low: u8 = (lenth & 0xFF) as u8;
|
||||
let mut header = vec![];
|
||||
header.push(0x55);
|
||||
header.push(0xAA);
|
||||
let mut crcbody = vec![];
|
||||
// crcbody.push(high);
|
||||
// crcbody.push(low);
|
||||
crcbody.extend(data);
|
||||
let crc = iris_calc_crc(&crcbody);
|
||||
let crchigh: u8 = (crc >> 8) as u8;
|
||||
let crclow: u8 = (crc & 0xFF) as u8;
|
||||
let mut senddata = vec![];
|
||||
senddata.extend(header);
|
||||
senddata.push(command);
|
||||
senddata.push(high);
|
||||
senddata.push(low);
|
||||
senddata.extend(crcbody);
|
||||
senddata.push(crchigh);
|
||||
senddata.push(crclow);
|
||||
|
||||
// println!("sendtoport data:{}",senddata.len());
|
||||
println!(
|
||||
"sendtoport data content:{:X?}",
|
||||
senddata
|
||||
.iter()
|
||||
.map(|&byte| format!("{:02X}", byte))
|
||||
.collect::<Vec<String>>()
|
||||
.join(" ")
|
||||
);
|
||||
sendtoprot(senddata);
|
||||
"send ok".to_string()
|
||||
}
|
||||
|
||||
// Learn more about Tauri commands at https://tauri.app/v1/guides/features/command
|
||||
#[tauri::command]
|
||||
fn greet(name: &str) -> String {
|
||||
format!("Hello, {}! You've been greeted from Rust!", name)
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn getportnames() -> Vec<String> {
|
||||
get_port_name()
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn opencom(portname: serde_json::Value, baudrate: serde_json::Value) -> String {
|
||||
//tauri
|
||||
let portname = portname.as_str().unwrap();
|
||||
let baudrate = baudrate.as_u64().unwrap() as u32;
|
||||
set_port_info(&portname.to_string(), baudrate);
|
||||
|
||||
println!("opencom portname:{} baudrate:{}", portname, baudrate);
|
||||
logtorust(format!(
|
||||
"opencom portname:{} baudrate:{}",
|
||||
portname, baudrate
|
||||
));
|
||||
tryuseport()
|
||||
}
|
||||
#[tauri::command]
|
||||
fn closecome() -> String {
|
||||
closeport()
|
||||
}
|
||||
#[tauri::command]
|
||||
fn sendtoport(data: serde_json::Value, datatype: serde_json::Value) -> String {
|
||||
// println!("sendtoport data:{}",data.to_string());
|
||||
//判断是否存在data
|
||||
// if !data.is_object() {
|
||||
// return String::from("Invalid data");
|
||||
// }
|
||||
println!("sendtoport data:{}", data.to_string());
|
||||
logtorust(format!("sendtoport data:{}", data.to_string()));
|
||||
let data = data.to_string().as_bytes().to_vec();
|
||||
let lenth = data.len() as u16;
|
||||
let high: u8 = (lenth >> 8) as u8;
|
||||
let low: u8 = (lenth & 0xFF) as u8;
|
||||
let mut header = vec![];
|
||||
header.push(0x55);
|
||||
header.push(0xAA);
|
||||
let mut command: u8 = 0;
|
||||
let datatype = datatype.as_str().unwrap();
|
||||
println!("datatype:{}", datatype);
|
||||
if datatype == "hex" {
|
||||
command = 0x03;
|
||||
}
|
||||
if datatype == "string" {
|
||||
command = 0x01;
|
||||
}
|
||||
if datatype == "json" {
|
||||
command = 0x00;
|
||||
}
|
||||
let mut crcbody = vec![];
|
||||
// crcbody.push(high);
|
||||
// crcbody.push(low);
|
||||
crcbody.extend(data);
|
||||
let crc = iris_calc_crc(&crcbody);
|
||||
let crchigh: u8 = (crc >> 8) as u8;
|
||||
let crclow: u8 = (crc & 0xFF) as u8;
|
||||
let mut senddata = vec![];
|
||||
senddata.extend(header);
|
||||
senddata.push(command);
|
||||
senddata.push(high);
|
||||
senddata.push(low);
|
||||
senddata.extend(crcbody);
|
||||
senddata.push(crchigh);
|
||||
senddata.push(crclow);
|
||||
|
||||
// println!("sendtoport data:{}",senddata.len());
|
||||
// println!(
|
||||
// "sendtoport data content:{:X?}",
|
||||
// senddata
|
||||
// .iter()
|
||||
// .map(|&byte| format!("{:02X}", byte))
|
||||
// .collect::<Vec<String>>()
|
||||
// .join(" ")
|
||||
// );
|
||||
logtorust(format!(
|
||||
"sendtoport data content:{:X?}",
|
||||
senddata
|
||||
.iter()
|
||||
.map(|&byte| format!("{:02X}", byte))
|
||||
.collect::<Vec<String>>()
|
||||
.join(" ")
|
||||
));
|
||||
|
||||
sendtoprot(senddata);
|
||||
"send ok".to_string()
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn readformport(commanid: serde_json::Value, wait_time_json: serde_json::Value) -> String {
|
||||
let mut waittime = 50;
|
||||
if wait_time_json.is_u64() {
|
||||
waittime = wait_time_json.as_u64().unwrap() as u32;
|
||||
}
|
||||
|
||||
let commanid = commanid.as_u64().unwrap() as u8;
|
||||
let ret = readdatafromport(waittime as u64, commanid);
|
||||
let str = String::from_utf8_lossy(&ret);
|
||||
println!("read data: {}", str);
|
||||
return str.to_string();
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn sendtoportAndgetreturn(
|
||||
data: serde_json::Value,
|
||||
datatype: serde_json::Value,
|
||||
) -> Result<RetStruct, String> {
|
||||
// println!("sendtoport data:{}",data.to_string());
|
||||
//判断是否存在data
|
||||
// if !data.is_object() {
|
||||
// return String::from("Invalid data");
|
||||
// }
|
||||
|
||||
//println!("sendtoport data:{}", data.to_string());
|
||||
|
||||
let command = data.get("command").unwrap().to_string();
|
||||
let mut isneedlog = true;
|
||||
let mut isgetdata = false;
|
||||
if command == "\"get_caiji_state\"" {
|
||||
isneedlog = false;
|
||||
}
|
||||
if command == "\"get_data\"" {
|
||||
isgetdata = true;
|
||||
|
||||
}
|
||||
|
||||
if isneedlog {
|
||||
logtorust(format!("sendtoport data:{}", data.to_string()));
|
||||
}
|
||||
|
||||
let data = data.to_string().as_bytes().to_vec();
|
||||
let lenth = data.len() as u16;
|
||||
let high: u8 = (lenth >> 8) as u8;
|
||||
let low: u8 = (lenth & 0xFF) as u8;
|
||||
let mut header = vec![];
|
||||
header.push(0x55);
|
||||
header.push(0xAA);
|
||||
let mut command: u8 = 0;
|
||||
let datatype = datatype.as_str().unwrap();
|
||||
println!("datatype:{}", datatype);
|
||||
if datatype == "hex" {
|
||||
command = 0x03;
|
||||
}
|
||||
if datatype == "string" {
|
||||
command = 0x01;
|
||||
}
|
||||
if datatype == "json" {
|
||||
command = 0x00;
|
||||
}
|
||||
let mut crcbody = vec![];
|
||||
// crcbody.push(high);
|
||||
// crcbody.push(low);
|
||||
crcbody.extend(data);
|
||||
let crc = iris_calc_crc(&crcbody);
|
||||
let crchigh: u8 = (crc >> 8) as u8;
|
||||
let crclow: u8 = (crc & 0xFF) as u8;
|
||||
let mut senddata = vec![];
|
||||
senddata.extend(header);
|
||||
senddata.push(command);
|
||||
senddata.push(high);
|
||||
senddata.push(low);
|
||||
senddata.extend(crcbody);
|
||||
senddata.push(crchigh);
|
||||
senddata.push(crclow);
|
||||
|
||||
println!("sendtoport data:{}", senddata.len());
|
||||
// println!(
|
||||
// "sendtoport data content:{:X?}",
|
||||
// senddata
|
||||
// .iter()
|
||||
// .map(|&byte| format!("{:02X}", byte))
|
||||
// .collect::<Vec<String>>()
|
||||
// .join(" ")
|
||||
// );
|
||||
if isneedlog {
|
||||
logtorust(format!(
|
||||
"sendtoport data content:{:X?}",
|
||||
senddata
|
||||
.iter()
|
||||
.map(|&byte| format!("{:02X}", byte))
|
||||
.collect::<Vec<String>>()
|
||||
.join(" ")
|
||||
));
|
||||
}
|
||||
|
||||
sendtoprot(senddata);
|
||||
let mut ret = readdatafromport(50, 0xff);
|
||||
let datatype = ret[0];
|
||||
|
||||
if isneedlog {
|
||||
if !isgetdata{
|
||||
logtorust(format!(
|
||||
"read content: {:X?}",
|
||||
ret.iter()
|
||||
.map(|&byte| format!("{:02X}", byte))
|
||||
.collect::<Vec<String>>()
|
||||
.join(" ")
|
||||
));
|
||||
}
|
||||
}
|
||||
if isgetdata{
|
||||
logtorust("Get data Back SUCCESS".to_string());
|
||||
logtorust("_____________________________one_data_over_____________________________\n".to_string());
|
||||
}
|
||||
|
||||
|
||||
ret.remove(0);
|
||||
ret.remove(0);
|
||||
ret.remove(0);
|
||||
if datatype == 0x02 {
|
||||
let mut is11data = IS11DataStruct::default();
|
||||
unsafe {
|
||||
let mut is11data_ptr = &mut is11data as *mut IS11DataStruct;
|
||||
let mut ret_ptr = &mut ret[0] as *mut u8;
|
||||
std::ptr::copy_nonoverlapping(
|
||||
ret_ptr,
|
||||
is11data_ptr as *mut u8,
|
||||
std::mem::size_of::<IS11DataStruct>(),
|
||||
);
|
||||
return Ok(RetStruct {
|
||||
datatype: datatype,
|
||||
content: "null".to_string(),
|
||||
data: is11data,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
let str = String::from_utf8_lossy(&ret);
|
||||
// println!("read data: {}", str);
|
||||
if datatype==0x00 &&isneedlog {
|
||||
logtorust(format![
|
||||
"read string: {}",
|
||||
str.to_string()
|
||||
]);
|
||||
|
||||
}
|
||||
return Ok(RetStruct {
|
||||
datatype: datatype,
|
||||
content: str.to_string(),
|
||||
data: IS11DataStruct::default(),
|
||||
});
|
||||
|
||||
// return str.to_string();
|
||||
}
|
||||
#[tauri::command]
|
||||
fn clearportbuff() -> String {
|
||||
clearserilport()
|
||||
}
|
||||
|
||||
#[tauri::command]
|
||||
fn setport(data: serde_json::Value) -> String {
|
||||
//判断是否存在portname和baudrate
|
||||
if !data.is_object() {
|
||||
return String::from("Invalid data");
|
||||
}
|
||||
if !data["portname"].is_string() || !data["baudrate"].is_u64() {
|
||||
return String::from("Invalid data");
|
||||
}
|
||||
let portname = data["portname"].as_str().unwrap();
|
||||
let baudrate = data["baudrate"].as_u64().unwrap() as u32;
|
||||
set_port_info(&portname.to_string(), baudrate);
|
||||
//println!("{}",readdatafromport(1000));
|
||||
String::from("Port set ok")
|
||||
}
|
||||
|
||||
use tauri::{LogicalSize, Manager, Size};
|
||||
|
||||
fn main() {
|
||||
// 使用宏生成处理程序列表
|
||||
mylog::initlog();
|
||||
mylog::logtorust("welecome to rust log");
|
||||
mylog::logtojs("welecome to rust log");
|
||||
|
||||
tauri::Builder::default()
|
||||
.invoke_handler(tauri::generate_handler![
|
||||
clearportbuff,
|
||||
greet,
|
||||
getportnames,
|
||||
opencom,
|
||||
setport,
|
||||
closecome,
|
||||
sendtoportAndgetreturn,
|
||||
readformport,
|
||||
sendtoport,
|
||||
interpolate_spline,
|
||||
sg_smooth,
|
||||
savecalibratefile,
|
||||
sendcalibratetodev,
|
||||
algorithm::Gaussian_filter_high,
|
||||
algorithm::interpolate_spline_at_points,
|
||||
algorithm::find_peek
|
||||
])
|
||||
.setup(|app| {
|
||||
let main_window = app.get_window("main").unwrap();
|
||||
|
||||
// 获取屏幕大小
|
||||
if let Some(monitor) = main_window.primary_monitor().unwrap() {
|
||||
let scale_factor = monitor.scale_factor();
|
||||
let physical_size = monitor.size();
|
||||
let logical_width = physical_size.width as f64 / scale_factor;
|
||||
let logical_height = physical_size.height as f64 / scale_factor;
|
||||
let new_width = logical_width * 0.8;
|
||||
let new_height = logical_height * 0.8;
|
||||
|
||||
// 设置窗口大小为屏幕大小的 80%
|
||||
main_window
|
||||
.set_size(Size::Logical(LogicalSize {
|
||||
width: new_width,
|
||||
height: new_height,
|
||||
}))
|
||||
.unwrap();
|
||||
|
||||
main_window.set_cursor_visible(true).unwrap();
|
||||
}
|
||||
|
||||
Ok(())
|
||||
})
|
||||
.run(tauri::generate_context!())
|
||||
.expect("error while running tauri application");
|
||||
}
|
78
src-tauri/src/mylog.rs
Normal file
@ -0,0 +1,78 @@
|
||||
use tklog::{
|
||||
debugs, errors, fatals, infos,
|
||||
sync::Logger,LEVEL, LOG,
|
||||
traces, warns, Format, MODE,async_traces,
|
||||
};
|
||||
use lazy_static::lazy_static;
|
||||
use std::{
|
||||
// fmt::format,
|
||||
borrow::{Borrow, BorrowMut}, sync::{Arc, Mutex}, thread::sleep
|
||||
};
|
||||
|
||||
struct LOGERME{
|
||||
LOGGER_RUST: Arc<Mutex<Logger>>,
|
||||
LOGGER_JS: Arc<Mutex<Logger>>,
|
||||
}
|
||||
lazy_static! {
|
||||
|
||||
static ref LOGERGloble: Arc<Mutex<LOGERME>> = Arc::new(Mutex::new(
|
||||
LOGERME{
|
||||
LOGGER_RUST:Arc::new( Mutex::new(Logger::new())),
|
||||
LOGGER_JS: Arc::new( Mutex::new(Logger::new())),
|
||||
}
|
||||
));
|
||||
|
||||
}
|
||||
// pub static LOGGER_RUST: Arc<Mutex<Logger>> =Arc::new( Mutex::new(Logger::new()));
|
||||
// pub static LOGGER_JS: Arc<Mutex<Logger>> = Arc::new(Mutex::new(Logger::new()));
|
||||
|
||||
|
||||
|
||||
|
||||
pub fn change_log_path(path: &str,String: &str) {
|
||||
if String=="RUST"{
|
||||
let mut loggerglobel = LOGERGloble.lock().unwrap();
|
||||
let mut log=loggerglobel.LOGGER_RUST.lock().unwrap();
|
||||
log.set_cutmode_by_time(path, MODE::DAY, 10, false);
|
||||
}else if String=="JS"{
|
||||
let mut loggerglobel=LOGERGloble.lock().unwrap();
|
||||
let mut log=loggerglobel.LOGGER_JS.lock().unwrap();
|
||||
log.set_cutmode_by_time(path, MODE::DAY, 10, false);
|
||||
}
|
||||
}
|
||||
|
||||
pub fn initlog() {
|
||||
|
||||
//let mut logger = LOGERGloble.lock().unwrap().LOGGER_RUST;
|
||||
let mut loggerglobel = LOGERGloble.lock().unwrap();
|
||||
let mut log=loggerglobel.LOGGER_RUST.lock().unwrap();
|
||||
log.set_console(true).set_format(Format::Date|Format::Time).set_formatter("{time} {file}{level}:{message}\n")
|
||||
.set_cutmode_by_time("rust_log.log",MODE::DAY, 10, false);
|
||||
// let mut logger = LOGERGloble.lock().unwrap().LOGGER_JS;
|
||||
//let mut loggerglobel = LOGERGloble.lock().unwrap();
|
||||
let mut log=loggerglobel.LOGGER_JS.lock().unwrap();
|
||||
log.set_console(false).set_format(Format::Date|Format::Time).set_formatter("{time}:\t{message}\n")
|
||||
.set_cutmode_by_time("js_log.log",MODE::DAY, 10, false);
|
||||
|
||||
}
|
||||
|
||||
pub fn logtorust<T>(str:T)
|
||||
where T: std::fmt::Display
|
||||
{
|
||||
let mut loggerglobe=LOGERGloble.lock().unwrap();
|
||||
let mut log=Arc::clone(&loggerglobe.LOGGER_RUST);
|
||||
|
||||
let log1 = log.borrow_mut();
|
||||
infos!( log1, str);
|
||||
}
|
||||
|
||||
pub fn logtojs<T>(str:T)
|
||||
where T: std::fmt::Display
|
||||
{
|
||||
let mut loggerglobe=LOGERGloble.lock().unwrap();
|
||||
let mut log=Arc::clone(&loggerglobe.LOGGER_JS);
|
||||
|
||||
let log1 = log.borrow_mut();
|
||||
infos!( log1, str);
|
||||
}
|
||||
|
155
src-tauri/src/serport/iris_protool.rs
Normal file
@ -0,0 +1,155 @@
|
||||
// use serialport::SerialPort;
|
||||
|
||||
|
||||
|
||||
pub fn _iris_protocol_pack(command: u8, length_of_in: u16, buffer_in: &[u8]) -> Option<Vec<u8>> {
|
||||
if length_of_in != 0 && buffer_in.is_empty() {
|
||||
return None;
|
||||
}
|
||||
let mut pack_data: Vec<u8> = vec![0u8; 5 ];
|
||||
pack_data[0] = 0x55;
|
||||
pack_data[1] = 0xAA;
|
||||
pack_data[2] = command;
|
||||
pack_data[3] = (length_of_in >> 8) as u8;
|
||||
pack_data[4] = (length_of_in & 0xFF) as u8;
|
||||
|
||||
let pack_crc: Vec<u8>=buffer_in.to_vec();
|
||||
let crc = iris_calc_crc(&pack_crc);
|
||||
pack_data.extend(pack_crc);
|
||||
pack_data.push((crc >> 8) as u8);
|
||||
pack_data.push(crc as u8);
|
||||
Some(pack_data)
|
||||
}
|
||||
|
||||
pub fn _iris_stm32_protocol_unpack(pack_data: &[u8]) -> Result<(u8, Vec<u8>), &'static str> {
|
||||
if pack_data.is_empty() {
|
||||
return Err("ERROR_INPUT");
|
||||
}
|
||||
if pack_data[0] != 0x55 || pack_data[1] != 0xAA {
|
||||
return Err("ERROR_HEADER");
|
||||
}
|
||||
//获取数据长度
|
||||
let length_of_data = (pack_data[4] as u16) + ((pack_data[3] as u16) << 8) ;
|
||||
//判断数据长度是否足够
|
||||
if length_of_data as usize > pack_data.len() - 7 {
|
||||
return Err("ERROR_NOT_ENOUGH_DATA");
|
||||
}
|
||||
//计算crc
|
||||
|
||||
let crc = iris_calc_crc(&pack_data[5..(length_of_data as usize) + 5]);
|
||||
let expected_crc = (pack_data[length_of_data as usize + 6] as u16) + ((pack_data[length_of_data as usize + 5] as u16) << 8);
|
||||
if crc != expected_crc {
|
||||
return Err("ERROR_CRC");
|
||||
}
|
||||
|
||||
let command = pack_data[2];
|
||||
let buffer_out = pack_data[5..(length_of_data as usize) + 5].to_vec();
|
||||
Ok((command, buffer_out))
|
||||
}
|
||||
|
||||
pub fn iris_protocol_unpack(pack_data: &[u8], command: u8) -> Result<Vec<u8>, &'static str> {
|
||||
if pack_data.is_empty() {
|
||||
return Err("ERROR_INPUT");
|
||||
}
|
||||
if pack_data[0] != 0x55 || pack_data[1] != 0xAA {
|
||||
return Err("ERROR_HEADER");
|
||||
}
|
||||
if pack_data[2] != command {
|
||||
if command != 0xff { return Err("ERROR_COMMAND"); }
|
||||
|
||||
}
|
||||
//获取数据长度
|
||||
let length_of_data = (pack_data[4] as u16) + ((pack_data[3] as u16) << 8) ;
|
||||
//判断数据长度是否足够
|
||||
if length_of_data as usize > pack_data.len() - 7 {
|
||||
return Err("ERROR_NOT_ENOUGH_DATA");
|
||||
}
|
||||
print!("length_of_data:{}",length_of_data);
|
||||
|
||||
// println!("{:?}", pack_data.iter().map(|&byte| format!("{:X}", byte)).collect::<Vec<String>>().join(" "));
|
||||
|
||||
let crc = iris_calc_crc(&pack_data[5..(length_of_data as usize) + 5]);
|
||||
let expected_crc: u16 = (pack_data[length_of_data as usize + 6] as u16) + ((pack_data[length_of_data as usize + 5] as u16) << 8);
|
||||
|
||||
println!("crc:{},expected_crc:{}",crc,expected_crc);
|
||||
// println!("{}:{}",pack_data[length_of_data as usize + 6],pack_data[length_of_data as usize + 5]);
|
||||
|
||||
|
||||
if crc != expected_crc {
|
||||
return Err("ERROR_CRC");
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Ok(pack_data[2..(length_of_data as usize) + 5].to_vec())
|
||||
}
|
||||
|
||||
pub fn iris_cut_before_header(pack_data: &mut Vec<u8>) -> usize {
|
||||
|
||||
let mut i = 0;
|
||||
while i < pack_data.len() {
|
||||
if pack_data[i] == 0x55 && pack_data.get(i + 1) == Some(&0xAA) {
|
||||
break;
|
||||
}
|
||||
i += 1;
|
||||
}
|
||||
|
||||
if i == pack_data.len() {
|
||||
pack_data.clear();
|
||||
return 0;
|
||||
}
|
||||
|
||||
let length_of_data = pack_data.len() - i;
|
||||
pack_data.drain(0..i);
|
||||
length_of_data
|
||||
}
|
||||
|
||||
pub fn _iris_check_data_valid(pack_data: &[u8]) -> Result<(), &'static str> {
|
||||
if pack_data.is_empty() {
|
||||
return Err("ERROR_INPUT");
|
||||
}
|
||||
if pack_data.len() < 7 {
|
||||
return Err("ERROR_NOT_ENOUGH_DATA");
|
||||
}
|
||||
if pack_data[0] != 0x55 || pack_data[1] != 0xAA {
|
||||
return Err("ERROR_HEADER");
|
||||
}
|
||||
|
||||
let length_of_data = (pack_data[4] as u16) + ((pack_data[3] as u16) << 8);
|
||||
if length_of_data as usize > pack_data.len() - 7 {
|
||||
return Err("ERROR_NOT_ENOUGH_DATA");
|
||||
}
|
||||
|
||||
let crc = iris_calc_crc(&pack_data[5..(length_of_data as usize) + 5]);
|
||||
let expected_crc = (pack_data[length_of_data as usize + 6] as u16) + ((pack_data[length_of_data as usize + 5] as u16) << 8);
|
||||
// println!("crc:{},expected_crc:{}",crc,expected_crc);
|
||||
if crc != expected_crc {
|
||||
return Err("ERROR_CRC");
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
pub fn iris_calc_crc(p_buffer: &[u8]) -> u16 {
|
||||
// println!("cut_before_header");
|
||||
// println!("{:?}", p_buffer.iter().map(|&byte| format!("{:X}", byte)).collect::<Vec<String>>().join(" "));
|
||||
let poly: u16 = 0x8408;
|
||||
let mut crc: u16 = 0;
|
||||
|
||||
for &byte in p_buffer {
|
||||
crc ^= byte as u16;
|
||||
for _ in 0..8 {
|
||||
let carry = crc & 1 != 0;
|
||||
crc >>= 1;
|
||||
if carry {
|
||||
crc ^= poly;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
crc
|
||||
}
|
||||
|
4
src-tauri/src/serport/mod.rs
Normal file
@ -0,0 +1,4 @@
|
||||
pub mod serport;
|
||||
pub mod iris_protool;
|
||||
|
||||
// remember to call `.manage(MyState::default())`
|
243
src-tauri/src/serport/serport.rs
Normal file
@ -0,0 +1,243 @@
|
||||
//静态变量 用来存储SerialPort对象
|
||||
use super::iris_protool::*;
|
||||
use lazy_static::lazy_static;
|
||||
use std::time::Duration;
|
||||
use std::{
|
||||
// fmt::format,
|
||||
sync::{Arc, Mutex},
|
||||
thread::sleep,
|
||||
};
|
||||
struct SeriesSettings {
|
||||
pub PortName: String,
|
||||
pub BaudRate: u32,
|
||||
pub port: Option<Box<dyn serialport::SerialPort>>,
|
||||
pub isopen: bool,
|
||||
}
|
||||
|
||||
lazy_static! {
|
||||
static ref PORT_INFO: Arc<Mutex<SeriesSettings>> = Arc::new(Mutex::new(SeriesSettings {
|
||||
PortName: String::from("NON"),
|
||||
BaudRate: 9600,
|
||||
port: None,
|
||||
isopen: false,
|
||||
}));
|
||||
}
|
||||
|
||||
pub fn tryuseport() -> String {
|
||||
let mut port_info = PORT_INFO.lock().unwrap();
|
||||
if port_info.PortName == "NON" {
|
||||
return format!("Port is not set");
|
||||
}
|
||||
if port_info.isopen {
|
||||
drop(port_info);
|
||||
closeport();
|
||||
port_info= PORT_INFO.lock().unwrap();
|
||||
}
|
||||
|
||||
|
||||
|
||||
port_info.port = match serialport::new(port_info.PortName.clone(), port_info.BaudRate).open() {
|
||||
Ok(p) => Some(p),
|
||||
Err(e) => {
|
||||
eprintln!("Failed to open Error: {}", e);
|
||||
return format!("Failed to open Error: {}", e);
|
||||
}
|
||||
};
|
||||
port_info.isopen = true;
|
||||
println!("Port is open");
|
||||
return String::from("Port is open");
|
||||
}
|
||||
|
||||
pub fn set_port_info(portname: &String, baudrate: u32) {
|
||||
let mut port_info = PORT_INFO.lock().unwrap();
|
||||
port_info.PortName = portname.to_string();
|
||||
port_info.BaudRate = baudrate;
|
||||
|
||||
}
|
||||
|
||||
pub fn get_port_name() -> Vec<String> {
|
||||
let ports = serialport::available_ports().expect("No ports found!");
|
||||
let mut portnames: Vec<String> = Vec::new();
|
||||
for p in ports {
|
||||
portnames.push(p.port_name);
|
||||
}
|
||||
return portnames;
|
||||
}
|
||||
|
||||
pub fn _reopenport() -> String {
|
||||
let mut port_info = PORT_INFO.lock().unwrap();
|
||||
if port_info.PortName == "NON" {
|
||||
return format!("Port is not set");
|
||||
}
|
||||
//关闭端口
|
||||
port_info.port = None;
|
||||
//重新打开端口
|
||||
port_info.port = match serialport::new(port_info.PortName.clone(), port_info.BaudRate).open() {
|
||||
Ok(p) => Some(p),
|
||||
Err(e) => {
|
||||
eprintln!("Failed to open Error: {}", e);
|
||||
return format!("Failed to open Error: {}", e);
|
||||
}
|
||||
};
|
||||
|
||||
String::from("Port is open")
|
||||
}
|
||||
|
||||
pub fn closeport() -> String {
|
||||
let mut port_info = PORT_INFO.lock().unwrap();
|
||||
if port_info.PortName == "NON" {
|
||||
return format!("Port is not set");
|
||||
}
|
||||
//关闭端口
|
||||
port_info.port = None;
|
||||
println!("Port is closed");
|
||||
String::from("Port is closed")
|
||||
}
|
||||
|
||||
pub fn sendtoprot(data: Vec<u8>) -> String {
|
||||
let mut port_info = PORT_INFO.lock().unwrap();
|
||||
if port_info.PortName == "NON" {
|
||||
return format!("Port is not set");
|
||||
}
|
||||
|
||||
match &mut port_info.port {
|
||||
Some(p) => match p.write(&data) {
|
||||
Ok(_) => {
|
||||
println!("Data sent");
|
||||
return String::from("Data sent");
|
||||
}
|
||||
Err(e) => {
|
||||
eprintln!("Failed to write to port: {}", e);
|
||||
return format!("Failed to write to port: {}", e);
|
||||
}
|
||||
},
|
||||
None => {
|
||||
return format!("Port is not open");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn clearserilport() -> String{
|
||||
let mut port_info = PORT_INFO.lock().unwrap();
|
||||
if port_info.PortName == "NON" {
|
||||
return "Port is not set".to_string();
|
||||
}
|
||||
let mut buf: Vec<u8> = vec![0; 1000];
|
||||
match &mut port_info.port {
|
||||
Some(p) => {
|
||||
p.set_timeout(Duration::from_millis(100)).unwrap();
|
||||
while true{
|
||||
let sizeread =match p.read(&mut buf){
|
||||
Ok(size)=>{size},
|
||||
Err(_e)=>{return "Port is not open".to_string()}
|
||||
};
|
||||
if sizeread==0 { return "OK".to_string(); }
|
||||
}
|
||||
}
|
||||
None => {
|
||||
port_info.isopen=false;
|
||||
return "Port is not open".to_string();
|
||||
}
|
||||
|
||||
}
|
||||
port_info.isopen=false;
|
||||
"OK".to_string()
|
||||
|
||||
}
|
||||
|
||||
|
||||
pub fn readdatafromport(waittime: u64, commanid: u8) -> Vec<u8> {
|
||||
let mut port_info = PORT_INFO.lock().unwrap();
|
||||
if port_info.PortName == "NON" {
|
||||
return "Port is not set".as_bytes().to_vec();
|
||||
}
|
||||
let mut buf: Vec<u8> = vec![0; 1000];
|
||||
let mut bufforrentrun: Vec<u8> = vec![0];
|
||||
match &mut port_info.port {
|
||||
Some(p) => {
|
||||
p.set_timeout(Duration::from_millis(100)).unwrap();
|
||||
let mut sizereadoftotal=0;
|
||||
let mut nowtimetry=0;
|
||||
while sizereadoftotal <5 {
|
||||
let sizeread =match p.read(&mut buf){
|
||||
Ok(size)=>{size},
|
||||
Err(_e)=>{0}
|
||||
};
|
||||
buf.truncate(sizeread);
|
||||
|
||||
bufforrentrun.extend_from_slice(&buf);
|
||||
//输出接收到的数据
|
||||
println!("{:?}:{}", buf.iter().map(|&byte| format!("{:02X}", byte)).collect::<Vec<String>>().join(" "),sizeread);
|
||||
sizereadoftotal =iris_cut_before_header(&mut bufforrentrun);
|
||||
nowtimetry+=1;
|
||||
if nowtimetry>waittime{
|
||||
return "long time no data retrun".as_bytes().to_vec();
|
||||
}
|
||||
sleep(Duration::from_millis(100));
|
||||
}
|
||||
|
||||
nowtimetry=0;
|
||||
// println!("{:?}", bufforrentrun);
|
||||
iris_cut_before_header(&mut bufforrentrun);
|
||||
|
||||
while match iris_protocol_unpack(&bufforrentrun, commanid) {
|
||||
Ok(buf) =>
|
||||
{
|
||||
return buf
|
||||
},
|
||||
Err(e) => {
|
||||
if e == "ERROR_NOT_ENOUGH_DATA" {
|
||||
true
|
||||
} else {
|
||||
println!("Error: {}", e.to_string());
|
||||
return e.to_string().as_bytes().to_vec();
|
||||
}
|
||||
}
|
||||
} {
|
||||
|
||||
let sizeread = match p.read(&mut buf) {
|
||||
Ok(size) => size,
|
||||
Err(msg) => {
|
||||
eprintln!("Failed to read from port: {}", msg);
|
||||
0
|
||||
}
|
||||
};
|
||||
buf.truncate(sizeread);
|
||||
bufforrentrun.extend_from_slice(&buf);
|
||||
//println!("{:?}", bufforrentrun.iter().map(|&byte| format!("{:X}", byte)).collect::<Vec<String>>().join(" "));
|
||||
nowtimetry+=1;
|
||||
if nowtimetry>waittime{
|
||||
return "long time no data retrun".as_bytes().to_vec();
|
||||
}
|
||||
}
|
||||
|
||||
return buf;
|
||||
}
|
||||
None => {
|
||||
return Vec::new();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pub fn iris_calc_crc(p_buffer: &[u8]) -> u16 {
|
||||
let poly: u16 = 0x8408;
|
||||
let mut crc: u16 = 0;
|
||||
|
||||
for &byte in p_buffer {
|
||||
crc ^= u16::from(byte);
|
||||
for _ in 0..8 {
|
||||
let carry = crc & 1 != 0;
|
||||
crc >>= 1;
|
||||
if carry {
|
||||
crc ^= poly;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
crc
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test() {
|
||||
tryuseport();
|
||||
}
|
72
src-tauri/tauri.conf.json
Normal file
@ -0,0 +1,72 @@
|
||||
{
|
||||
"build": {
|
||||
"beforeDevCommand": "npm run dev",
|
||||
"beforeBuildCommand": "npm run build",
|
||||
"devPath": "http://localhost:1420",
|
||||
"distDir": "../dist",
|
||||
"withGlobalTauri": true
|
||||
},
|
||||
"package": {
|
||||
"productName": "SpectralPlot",
|
||||
"version": "0.4.14"
|
||||
},
|
||||
"tauri": {
|
||||
|
||||
"allowlist": {
|
||||
"process": {
|
||||
"all": true
|
||||
},
|
||||
"all": false,
|
||||
"shell": {
|
||||
"all": false,
|
||||
"open": true
|
||||
},
|
||||
"fs": {
|
||||
"scope": ["**"],
|
||||
"all": true
|
||||
|
||||
},
|
||||
"dialog": {
|
||||
"all": true
|
||||
},
|
||||
"window": {
|
||||
"all": true
|
||||
}
|
||||
|
||||
},
|
||||
"windows": [
|
||||
{
|
||||
"title": "Spectral Plot",
|
||||
"width": 0,
|
||||
"height":0,
|
||||
"resizable": true,
|
||||
"fullscreen": false,
|
||||
"decorations": true,
|
||||
"minimizable": true,
|
||||
"maximizable": true,
|
||||
"visible": true
|
||||
}
|
||||
],
|
||||
"security": {
|
||||
"csp": null
|
||||
},
|
||||
|
||||
"bundle": {
|
||||
"active": true,
|
||||
"targets": "all",
|
||||
"identifier": "lele.rlx",
|
||||
"resources": [
|
||||
"config.json"
|
||||
],
|
||||
"icon": [
|
||||
"icons/32x32.png",
|
||||
"icons/128x128.png",
|
||||
"icons/128x128@2x.png",
|
||||
"icons/icon.icns",
|
||||
"icons/icon.ico"
|
||||
]
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
2049
src-tauri/test0_UP.csv
Normal file
26
src/App.vue
Normal 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
@ -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
@ -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
@ -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
@ -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>
|
1
src/components/HyperSpectralDeffines.js
Normal file
@ -0,0 +1 @@
|
||||
|
85
src/components/HyperSpectralMainView.vue
Normal 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>
|
224
src/components/HyperSpectralMethod.js
Normal 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', // 图例的选择模式。默认开启图例开关,可选single,multiple
|
||||
},
|
||||
// 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', // 图例的选择模式。默认开启图例开关,可选single,multiple
|
||||
// },
|
||||
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));
|
||||
}
|
||||
|
||||
}
|
177
src/components/SerialPort/SerialportMethod.js
Normal 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
|
||||
|
||||
|
||||
|
||||
}
|
431
src/components/SiderleftSerilportMethod.js
Normal 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));
|
||||
}
|
34
src/components/commentep.vue
Normal 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>
|
3
src/components/config.json
Normal file
@ -0,0 +1,3 @@
|
||||
{
|
||||
"pathofsave": "./data"
|
||||
}
|
166
src/components/menubar.vue
Normal 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>
|
||||
|
||||
<!-- <!– Navbar dropdowns –>-->
|
||||
<!-- <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>
|
597
src/components/menubox/SetCalibrate.vue
Normal 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', // 图例的选择模式。默认开启图例开关,可选single,multiple
|
||||
},
|
||||
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>
|
66
src/components/menubox/SetName.vue
Normal 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>
|
303
src/components/menubox/SetWavelenth.vue
Normal 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', // 图例的选择模式。默认开启图例开关,可选single,multiple
|
||||
// },
|
||||
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>
|
152
src/components/menubox/SetWorkmode.vue
Normal 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
@ -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>
|
27
src/components/serportdefine.js
Normal 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;
|
||||
|
367
src/components/siderleft.vue
Normal 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>
|
383
src/components/siderleftmethod.js
Normal 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', // 图例的选择模式。默认开启图例开关,可选single,multiple
|
||||
// },
|
||||
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
@ -0,0 +1,5 @@
|
||||
import mitt from 'mitt';
|
||||
|
||||
const EventBus = mitt();
|
||||
|
||||
export default EventBus;
|
54
src/main.js
Normal 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
@ -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;
|
||||
}
|
||||
}
|
28
vite.config.js
Normal file
@ -0,0 +1,28 @@
|
||||
import { defineConfig } from "vite";
|
||||
import vue from "@vitejs/plugin-vue";
|
||||
import Components from 'unplugin-vue-components/vite'
|
||||
import {BootstrapVueNextResolver} from 'unplugin-vue-components/resolvers'
|
||||
|
||||
// https://vitejs.dev/config/
|
||||
export default defineConfig(async () => ({
|
||||
plugins: [vue(),
|
||||
Components({
|
||||
resolvers: [BootstrapVueNextResolver()],
|
||||
}),
|
||||
],
|
||||
|
||||
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
|
||||
//
|
||||
// 1. prevent vite from obscuring rust errors
|
||||
clearScreen: false,
|
||||
// 2. tauri expects a fixed port, fail if that port is not available
|
||||
server: {
|
||||
port: 1420,
|
||||
strictPort: true,
|
||||
watch: {
|
||||
// 3. tell vite to ignore watching `src-tauri`
|
||||
ignored: ["**/src-tauri/**"],
|
||||
},
|
||||
},
|
||||
|
||||
}));
|
30
vite.config.js.timestamp-1718084764570-9e9d1182cd88f.mjs
Normal file
@ -0,0 +1,30 @@
|
||||
// vite.config.js
|
||||
import { defineConfig } from "file:///D:/06Learn/rust/tarui/myfirst_tauri/node_modules/vite/dist/node/index.js";
|
||||
import vue from "file:///D:/06Learn/rust/tarui/myfirst_tauri/node_modules/@vitejs/plugin-vue/dist/index.mjs";
|
||||
import Components from "file:///D:/06Learn/rust/tarui/myfirst_tauri/node_modules/unplugin-vue-components/dist/vite.js";
|
||||
import { BootstrapVueNextResolver } from "file:///D:/06Learn/rust/tarui/myfirst_tauri/node_modules/unplugin-vue-components/dist/resolvers.js";
|
||||
var vite_config_default = defineConfig(async () => ({
|
||||
plugins: [
|
||||
vue(),
|
||||
Components({
|
||||
resolvers: [BootstrapVueNextResolver()]
|
||||
})
|
||||
],
|
||||
// Vite options tailored for Tauri development and only applied in `tauri dev` or `tauri build`
|
||||
//
|
||||
// 1. prevent vite from obscuring rust errors
|
||||
clearScreen: false,
|
||||
// 2. tauri expects a fixed port, fail if that port is not available
|
||||
server: {
|
||||
port: 1420,
|
||||
strictPort: true,
|
||||
watch: {
|
||||
// 3. tell vite to ignore watching `src-tauri`
|
||||
ignored: ["**/src-tauri/**"]
|
||||
}
|
||||
}
|
||||
}));
|
||||
export {
|
||||
vite_config_default as default
|
||||
};
|
||||
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsidml0ZS5jb25maWcuanMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbImNvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9kaXJuYW1lID0gXCJEOlxcXFwwNkxlYXJuXFxcXHJ1c3RcXFxcdGFydWlcXFxcbXlmaXJzdF90YXVyaVwiO2NvbnN0IF9fdml0ZV9pbmplY3RlZF9vcmlnaW5hbF9maWxlbmFtZSA9IFwiRDpcXFxcMDZMZWFyblxcXFxydXN0XFxcXHRhcnVpXFxcXG15Zmlyc3RfdGF1cmlcXFxcdml0ZS5jb25maWcuanNcIjtjb25zdCBfX3ZpdGVfaW5qZWN0ZWRfb3JpZ2luYWxfaW1wb3J0X21ldGFfdXJsID0gXCJmaWxlOi8vL0Q6LzA2TGVhcm4vcnVzdC90YXJ1aS9teWZpcnN0X3RhdXJpL3ZpdGUuY29uZmlnLmpzXCI7aW1wb3J0IHsgZGVmaW5lQ29uZmlnIH0gZnJvbSBcInZpdGVcIjtcclxuaW1wb3J0IHZ1ZSBmcm9tIFwiQHZpdGVqcy9wbHVnaW4tdnVlXCI7XHJcbmltcG9ydCBDb21wb25lbnRzIGZyb20gJ3VucGx1Z2luLXZ1ZS1jb21wb25lbnRzL3ZpdGUnXHJcbmltcG9ydCB7Qm9vdHN0cmFwVnVlTmV4dFJlc29sdmVyfSBmcm9tICd1bnBsdWdpbi12dWUtY29tcG9uZW50cy9yZXNvbHZlcnMnXHJcblxyXG4vLyBodHRwczovL3ZpdGVqcy5kZXYvY29uZmlnL1xyXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb25maWcoYXN5bmMgKCkgPT4gKHtcclxuICBwbHVnaW5zOiBbdnVlKCksXHJcbiAgICBDb21wb25lbnRzKHtcclxuICAgICAgcmVzb2x2ZXJzOiBbQm9vdHN0cmFwVnVlTmV4dFJlc29sdmVyKCldLFxyXG4gICAgfSksXHJcbiAgXSxcclxuXHJcbiAgLy8gVml0ZSBvcHRpb25zIHRhaWxvcmVkIGZvciBUYXVyaSBkZXZlbG9wbWVudCBhbmQgb25seSBhcHBsaWVkIGluIGB0YXVyaSBkZXZgIG9yIGB0YXVyaSBidWlsZGBcclxuICAvL1xyXG4gIC8vIDEuIHByZXZlbnQgdml0ZSBmcm9tIG9ic2N1cmluZyBydXN0IGVycm9yc1xyXG4gIGNsZWFyU2NyZWVuOiBmYWxzZSxcclxuICAvLyAyLiB0YXVyaSBleHBlY3RzIGEgZml4ZWQgcG9ydCwgZmFpbCBpZiB0aGF0IHBvcnQgaXMgbm90IGF2YWlsYWJsZVxyXG4gIHNlcnZlcjoge1xyXG4gICAgcG9ydDogMTQyMCxcclxuICAgIHN0cmljdFBvcnQ6IHRydWUsXHJcbiAgICB3YXRjaDoge1xyXG4gICAgICAvLyAzLiB0ZWxsIHZpdGUgdG8gaWdub3JlIHdhdGNoaW5nIGBzcmMtdGF1cmlgXHJcbiAgICAgIGlnbm9yZWQ6IFtcIioqL3NyYy10YXVyaS8qKlwiXSxcclxuICAgIH0sXHJcbiAgfSxcclxuXHJcbn0pKTtcclxuIl0sCiAgIm1hcHBpbmdzIjogIjtBQUFxUyxTQUFTLG9CQUFvQjtBQUNsVSxPQUFPLFNBQVM7QUFDaEIsT0FBTyxnQkFBZ0I7QUFDdkIsU0FBUSxnQ0FBK0I7QUFHdkMsSUFBTyxzQkFBUSxhQUFhLGFBQWE7QUFBQSxFQUN2QyxTQUFTO0FBQUEsSUFBQyxJQUFJO0FBQUEsSUFDWixXQUFXO0FBQUEsTUFDVCxXQUFXLENBQUMseUJBQXlCLENBQUM7QUFBQSxJQUN4QyxDQUFDO0FBQUEsRUFDSDtBQUFBO0FBQUE7QUFBQTtBQUFBLEVBS0EsYUFBYTtBQUFBO0FBQUEsRUFFYixRQUFRO0FBQUEsSUFDTixNQUFNO0FBQUEsSUFDTixZQUFZO0FBQUEsSUFDWixPQUFPO0FBQUE7QUFBQSxNQUVMLFNBQVMsQ0FBQyxpQkFBaUI7QUFBQSxJQUM3QjtBQUFBLEVBQ0Y7QUFFRixFQUFFOyIsCiAgIm5hbWVzIjogW10KfQo=
|