diff --git a/.roo/mcp.json b/.roo/mcp.json new file mode 100644 index 0000000..0206dbc --- /dev/null +++ b/.roo/mcp.json @@ -0,0 +1,12 @@ +{ + "mcpServers": { + "filesystem": { + "command": "npx", + "args": [ + "-y", + "@modelcontextprotocol/server-filesystem", + "./" + ] + } + } +} \ No newline at end of file diff --git a/doc/数据查看前端文档.md b/doc/数据查看前端文档.md new file mode 100644 index 0000000..89b2371 --- /dev/null +++ b/doc/数据查看前端文档.md @@ -0,0 +1,3 @@ + 1 函数 invoke("getoneirisfile",{path:"iris_data_example.iris"}) 返回一次数据 + +2 fs diff --git a/myis11/project/is3/cmake-build-debug-visual-studio/CMakeFiles/clion-Debug-Visual Studio-log.txt b/myis11/project/is3/cmake-build-debug-visual-studio/CMakeFiles/clion-Debug-Visual Studio-log.txt index b1eedf3..5b7e909 100644 --- a/myis11/project/is3/cmake-build-debug-visual-studio/CMakeFiles/clion-Debug-Visual Studio-log.txt +++ b/myis11/project/is3/cmake-build-debug-visual-studio/CMakeFiles/clion-Debug-Visual Studio-log.txt @@ -2,6 +2,6 @@ C:\Users\xin\AppData\Local\Programs\CLion\bin\cmake\win\x64\bin\cmake.exe -DCMAK -- FOUND CSerialPort, E:/01MyCode/vcpkg/vcpkgclion/installed/x64-windows/debug/lib/libcserialport.lib -- CSerialPort_INCLUDE_DIR: E:/01MyCode/vcpkg/vcpkgclion/installed/x64-windows/include -- CSerialPort_LIBRARY: E:/01MyCode/vcpkg/vcpkgclion/installed/x64-windows/debug/lib/libcserialport.lib --- Configuring done (1.2s) --- Generating done (0.4s) +-- Configuring done (0.5s) +-- Generating done (0.1s) -- Build files have been written to: D:/06Learn/rust/tarui/myfirst_tauri/myis11/project/is3/cmake-build-debug-visual-studio diff --git a/myis11/project/is3/cmake-build-release-visual-studio/.ninja_log b/myis11/project/is3/cmake-build-release-visual-studio/.ninja_log index 371abda..2aad029 100644 --- a/myis11/project/is3/cmake-build-release-visual-studio/.ninja_log +++ b/myis11/project/is3/cmake-build-release-visual-studio/.ninja_log @@ -3,7 +3,7 @@ 21 907 7659725145667238 CMakeFiles/iris_is3lib.dir/D_/06Learn/rust/tarui/myfirst_tauri/myis11/src/IRIS_IS3/IS3_INST.cpp.obj 3c5858a3264438b4 33 941 7659725145778173 CMakeFiles/is3test.dir/testmain.cpp.obj 905a72b1ea8bf22c 2 616 7669134105668608 CMakeFiles/iris_is3lib.dir/D_/06Learn/rust/tarui/myfirst_tauri/myis11/src/IRIS_IS3/SensorIS3.cpp.obj 96f167c4e5f0d851 -1 71 7677050246360766 build.ninja 7106bca1f4b570da +1 71 7725385590380927 build.ninja 7106bca1f4b570da 27 1400 7659725145725854 CMakeFiles/iris_is3lib.dir/D_/06Learn/rust/tarui/myfirst_tauri/myis11/src/IRIS_IS3/IS3Comon.cpp.obj 4364cfe7f408eeb7 4 94 7630155613477022 CMakeFiles/iris_is3lib.dir/D_/06Learn/rust/tarui/myfirst_tauri/myis11/src/thirdpart/iris_proto_tool/src/IRIS_Method.cpp.obj 366a7a8636d2dadc 617 1030 7669134111816719 iris_is3lib.dll c7564dfa3e9c17a2 diff --git a/myis11/project/is3/cmake-build-release-visual-studio/CMakeFiles/clion-Release-Visual Studio-log.txt b/myis11/project/is3/cmake-build-release-visual-studio/CMakeFiles/clion-Release-Visual Studio-log.txt index bdc3ab1..1b66e7a 100644 --- a/myis11/project/is3/cmake-build-release-visual-studio/CMakeFiles/clion-Release-Visual Studio-log.txt +++ b/myis11/project/is3/cmake-build-release-visual-studio/CMakeFiles/clion-Release-Visual Studio-log.txt @@ -2,6 +2,6 @@ C:\Users\xin\AppData\Local\Programs\CLion\bin\cmake\win\x64\bin\cmake.exe -DCMAK -- FOUND CSerialPort, E:/01MyCode/vcpkg/vcpkgclion/installed/x64-windows/lib/libcserialport.lib -- CSerialPort_INCLUDE_DIR: E:/01MyCode/vcpkg/vcpkgclion/installed/x64-windows/include -- CSerialPort_LIBRARY: E:/01MyCode/vcpkg/vcpkgclion/installed/x64-windows/lib/libcserialport.lib --- Configuring done (1.2s) --- Generating done (0.3s) +-- Configuring done (0.5s) +-- Generating done (0.1s) -- Build files have been written to: D:/06Learn/rust/tarui/myfirst_tauri/myis11/project/is3/cmake-build-release-visual-studio diff --git a/package-lock.json b/package-lock.json index 94d3ba5..c6bd5e1 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,12 +18,14 @@ "element-plus": "^2.4.4", "json-editor-vue3": "^1.1.1", "less": "^4.2.0", + "maptalks": "^1.1.3", "markdown-it": "^14.1.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", + "vue-markdown-render": "^2.2.1", "vue3-json-editor": "^1.1.5", "vue3-konami-code": "^1.0.0" }, @@ -631,6 +633,25 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, + "node_modules/@maptalks/feature-filter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@maptalks/feature-filter/-/feature-filter-1.3.0.tgz", + "integrity": "sha512-O6GcFzPuCbz6bO4TNBnmP8VunS0GexTzZ4m36A4HbYQICY1cplpFgntX2fyB/TY3cZrFRGoeMePBeMZFMOOhcQ==" + }, + "node_modules/@maptalks/function-type": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@maptalks/function-type/-/function-type-1.4.1.tgz", + "integrity": "sha512-Z78FdI8mZ4vdcBqxlMDV6HP6WE/njZ9PhlM5JwbURxW1DnQK7R1GP+fubkGJPP6hVSv0Y52/dK8cZE/HuXVZ3A==", + "dependencies": { + "colorin": "^0.5.0" + } + }, + "node_modules/@maptalks/function-type/node_modules/colorin": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/colorin/-/colorin-0.5.0.tgz", + "integrity": "sha512-gN6fIMCehYUonAhbmm5+ZHeFunG75u77hI2tRlVndNthO6v0wZMV2G2FwYSi8Ws4b4lpFJK1ql2a/MlW9z/Vhg==", + "license": "MIT" + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -746,7 +767,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -914,7 +934,6 @@ "cpu": [ "x64" ], - "dev": true, "license": "MIT", "optional": true, "os": [ @@ -1723,10 +1742,11 @@ } }, "node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, + "license": "MIT", "dependencies": { "balanced-match": "^1.0.0" } @@ -1834,6 +1854,12 @@ "simple-swizzle": "^0.2.2" } }, + "node_modules/colorin": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/colorin/-/colorin-0.6.0.tgz", + "integrity": "sha512-huI54MwKNMP6eypurqzxGf7rvTA3pNWdXZopQbN7v3TDxXYWyyGQ3CtQndNZ2Z0Gy6HDWqA7sRYxbjRDO2FZMA==", + "license": "MIT" + }, "node_modules/compute-scroll-into-view": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", @@ -2234,6 +2260,12 @@ "node": ">= 0.6" } }, + "node_modules/frustum-intersects": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/frustum-intersects/-/frustum-intersects-0.1.0.tgz", + "integrity": "sha512-W0S6dmX5LJLtamimyuKhvbkpDTm5eVfMgk4X9yXNyWQ1zZ/cMm0PZoeX9Pm0tL302l+erQVrdfRGhV3ILfeTeQ==", + "license": "MIT" + }, "node_modules/fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -2536,9 +2568,9 @@ } }, "node_modules/koa": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.0.tgz", - "integrity": "sha512-Afhqq0Vq3W7C+/rW6IqHVBDLzqObwZ07JaUNUEF8yCQ6afiyFE3RAy+i7V0E46XOWlH7vPWn/x0vsZwNy6PWxw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", + "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", "license": "MIT", "dependencies": { "accepts": "^1.3.5", @@ -2644,6 +2676,12 @@ "source-map": "~0.6.0" } }, + "node_modules/lineclip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/lineclip/-/lineclip-1.1.5.tgz", + "integrity": "sha512-KlA/wRSjpKl7tS9iRUdlG72oQ7qZ1IlVbVgHwoO10TBR/4gQ86uhKow6nlzMAJJhjCWKto8OeoAzzIzKSmN25A==", + "license": "ISC" + }, "node_modules/linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", @@ -2710,6 +2748,25 @@ "node": ">=6" } }, + "node_modules/maptalks": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/maptalks/-/maptalks-1.1.3.tgz", + "integrity": "sha512-swf+5/h7s9SyHgnz5Gnnocjq1TVBbmazZnP2iPN+bzbNTf0ExnjVCiqml9wuPHBcUW3LCzjLqzL6KCB0CVCv+g==", + "license": "BSD-3-Clause", + "dependencies": { + "@maptalks/feature-filter": "^1.3.0", + "@maptalks/function-type": "^1.4.1", + "colorin": "^0.6.0", + "frustum-intersects": "^0.1.0", + "lineclip": "^1.1.5", + "rbush": "^2.0.2", + "simplify-js": "^1.2.1" + }, + "optionalDependencies": { + "@rollup/rollup-darwin-x64": "^4.13.0", + "@rollup/rollup-linux-x64-gnu": "^4.13.0" + } + }, "node_modules/markdown-it": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", @@ -3095,6 +3152,21 @@ } ] }, + "node_modules/quickselect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", + "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==", + "license": "ISC" + }, + "node_modules/rbush": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", + "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", + "license": "MIT", + "dependencies": { + "quickselect": "^1.0.1" + } + }, "node_modules/readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -3298,6 +3370,12 @@ "is-arrayish": "^0.3.1" } }, + "node_modules/simplify-js": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/simplify-js/-/simplify-js-1.2.4.tgz", + "integrity": "sha512-vITfSlwt7h/oyrU42R83mtzFpwYk3+mkH9bOHqq/Qw6n8rtR7aE3NZQ5fbcyCUVVmuMJR6ynsAhOfK2qoah8Jg==", + "license": "BSD-2-Clause" + }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -3341,6 +3419,51 @@ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, + "node_modules/tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/tinyglobby/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/tinyglobby/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/to-regex-range": { "version": "5.0.1", "resolved": "https://mirrors.cloud.tencent.com/npm/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -3481,15 +3604,18 @@ } }, "node_modules/vite": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", - "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "license": "MIT", "dependencies": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" }, "bin": { "vite": "bin/vite.js" @@ -3552,6 +3678,34 @@ } } }, + "node_modules/vite/node_modules/fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "license": "MIT", + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/vite/node_modules/picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, "node_modules/vue": { "version": "3.4.21", "resolved": "https://registry.npmjs.org/vue/-/vue-3.4.21.tgz", @@ -3588,6 +3742,67 @@ "vue": "^3.2.2" } }, + "node_modules/vue-markdown-render": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vue-markdown-render/-/vue-markdown-render-2.2.1.tgz", + "integrity": "sha512-XkYnC0PMdbs6Vy6j/gZXSvCuOS0787Se5COwXlepRqiqPiunyCIeTPQAO2XnB4Yl04EOHXwLx5y6IuszMWSgyQ==", + "license": "MIT", + "dependencies": { + "markdown-it": "^13.0.2" + }, + "peerDependencies": { + "vue": "^3.3.4" + } + }, + "node_modules/vue-markdown-render/node_modules/entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/vue-markdown-render/node_modules/linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "license": "MIT", + "dependencies": { + "uc.micro": "^1.0.1" + } + }, + "node_modules/vue-markdown-render/node_modules/markdown-it": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + }, + "bin": { + "markdown-it": "bin/markdown-it.js" + } + }, + "node_modules/vue-markdown-render/node_modules/mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==", + "license": "MIT" + }, + "node_modules/vue-markdown-render/node_modules/uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==", + "license": "MIT" + }, "node_modules/vue3-json-editor": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/vue3-json-editor/-/vue3-json-editor-1.1.5.tgz", @@ -3920,6 +4135,26 @@ "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" }, + "@maptalks/feature-filter": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/@maptalks/feature-filter/-/feature-filter-1.3.0.tgz", + "integrity": "sha512-O6GcFzPuCbz6bO4TNBnmP8VunS0GexTzZ4m36A4HbYQICY1cplpFgntX2fyB/TY3cZrFRGoeMePBeMZFMOOhcQ==" + }, + "@maptalks/function-type": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/@maptalks/function-type/-/function-type-1.4.1.tgz", + "integrity": "sha512-Z78FdI8mZ4vdcBqxlMDV6HP6WE/njZ9PhlM5JwbURxW1DnQK7R1GP+fubkGJPP6hVSv0Y52/dK8cZE/HuXVZ3A==", + "requires": { + "colorin": "^0.5.0" + }, + "dependencies": { + "colorin": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/colorin/-/colorin-0.5.0.tgz", + "integrity": "sha512-gN6fIMCehYUonAhbmm5+ZHeFunG75u77hI2tRlVndNthO6v0wZMV2G2FwYSi8Ws4b4lpFJK1ql2a/MlW9z/Vhg==" + } + } + }, "@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", @@ -3987,7 +4222,6 @@ "version": "4.38.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.38.0.tgz", "integrity": "sha512-Mgcmc78AjunP1SKXl624vVBOF2bzwNWFPMP4fpOu05vS0amnLcX8gHIge7q/lDAHy3T2HeR0TqrriZDQS2Woeg==", - "dev": true, "optional": true }, "@rollup/rollup-freebsd-arm64": { @@ -4071,7 +4305,6 @@ "version": "4.38.0", "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.38.0.tgz", "integrity": "sha512-vPvNgFlZRAgO7rwncMeE0+8c4Hmc+qixnp00/Uv3ht2x7KYrJ6ERVd3/R0nUtlE6/hu7/HiiNHJ/rP6knRFt1w==", - "dev": true, "optional": true }, "@rollup/rollup-linux-x64-musl": { @@ -4557,9 +4790,9 @@ } }, "brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", + "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", "dev": true, "requires": { "balanced-match": "^1.0.0" @@ -4649,6 +4882,11 @@ "simple-swizzle": "^0.2.2" } }, + "colorin": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/colorin/-/colorin-0.6.0.tgz", + "integrity": "sha512-huI54MwKNMP6eypurqzxGf7rvTA3pNWdXZopQbN7v3TDxXYWyyGQ3CtQndNZ2Z0Gy6HDWqA7sRYxbjRDO2FZMA==" + }, "compute-scroll-into-view": { "version": "1.0.20", "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", @@ -4939,6 +5177,11 @@ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" }, + "frustum-intersects": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/frustum-intersects/-/frustum-intersects-0.1.0.tgz", + "integrity": "sha512-W0S6dmX5LJLtamimyuKhvbkpDTm5eVfMgk4X9yXNyWQ1zZ/cMm0PZoeX9Pm0tL302l+erQVrdfRGhV3ILfeTeQ==" + }, "fsevents": { "version": "2.3.3", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", @@ -5166,9 +5409,9 @@ } }, "koa": { - "version": "2.16.0", - "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.0.tgz", - "integrity": "sha512-Afhqq0Vq3W7C+/rW6IqHVBDLzqObwZ07JaUNUEF8yCQ6afiyFE3RAy+i7V0E46XOWlH7vPWn/x0vsZwNy6PWxw==", + "version": "2.16.1", + "resolved": "https://registry.npmjs.org/koa/-/koa-2.16.1.tgz", + "integrity": "sha512-umfX9d3iuSxTQP4pnzLOz0HKnPg0FaUUIKcye2lOiz3KPu1Y3M3xlz76dISdFPQs37P9eJz1wUpcTS6KDPn9fA==", "requires": { "accepts": "^1.3.5", "cache-content-type": "^1.0.0", @@ -5257,6 +5500,11 @@ "tslib": "^2.3.0" } }, + "lineclip": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/lineclip/-/lineclip-1.1.5.tgz", + "integrity": "sha512-KlA/wRSjpKl7tS9iRUdlG72oQ7qZ1IlVbVgHwoO10TBR/4gQ86uhKow6nlzMAJJhjCWKto8OeoAzzIzKSmN25A==" + }, "linkify-it": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-5.0.0.tgz", @@ -5309,6 +5557,22 @@ "semver": "^5.6.0" } }, + "maptalks": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/maptalks/-/maptalks-1.1.3.tgz", + "integrity": "sha512-swf+5/h7s9SyHgnz5Gnnocjq1TVBbmazZnP2iPN+bzbNTf0ExnjVCiqml9wuPHBcUW3LCzjLqzL6KCB0CVCv+g==", + "requires": { + "@maptalks/feature-filter": "^1.3.0", + "@maptalks/function-type": "^1.4.1", + "@rollup/rollup-darwin-x64": "^4.13.0", + "@rollup/rollup-linux-x64-gnu": "^4.13.0", + "colorin": "^0.6.0", + "frustum-intersects": "^0.1.0", + "lineclip": "^1.1.5", + "rbush": "^2.0.2", + "simplify-js": "^1.2.1" + } + }, "markdown-it": { "version": "14.1.0", "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-14.1.0.tgz", @@ -5568,6 +5832,19 @@ "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", "dev": true }, + "quickselect": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz", + "integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ==" + }, + "rbush": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz", + "integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==", + "requires": { + "quickselect": "^1.0.1" + } + }, "readdirp": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", @@ -5711,6 +5988,11 @@ "is-arrayish": "^0.3.1" } }, + "simplify-js": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/simplify-js/-/simplify-js-1.2.4.tgz", + "integrity": "sha512-vITfSlwt7h/oyrU42R83mtzFpwYk3+mkH9bOHqq/Qw6n8rtR7aE3NZQ5fbcyCUVVmuMJR6ynsAhOfK2qoah8Jg==" + }, "source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -5738,6 +6020,31 @@ "resolved": "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.1.0.tgz", "integrity": "sha512-NB6Dk1A9xgQPMoGqC5CVXn123gWyte215ONT5Pp5a0yt4nlEoO1ZWeCwpncaekPHXO60i47ihFnZPiRPjRMq4Q==" }, + "tinyglobby": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.14.tgz", + "integrity": "sha512-tX5e7OM1HnYr2+a2C/4V0htOcSQcoSTH9KgJnVvNm5zm/cyEWKJ7j7YutsH9CxMdtOkkLFy2AHrMci9IM8IPZQ==", + "dev": true, + "requires": { + "fdir": "^6.4.4", + "picomatch": "^4.0.2" + }, + "dependencies": { + "fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } + } + }, "to-regex-range": { "version": "5.0.1", "resolved": "https://mirrors.cloud.tencent.com/npm/to-regex-range/-/to-regex-range-5.0.1.tgz", @@ -5839,15 +6146,33 @@ "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" }, "vite": { - "version": "6.2.3", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.2.3.tgz", - "integrity": "sha512-IzwM54g4y9JA/xAeBPNaDXiBF8Jsgl3VBQ2YQ/wOY6fyW3xMdSoltIV3Bo59DErdqdE6RxUfv8W69DvUorE4Eg==", + "version": "6.3.5", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", + "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", "dev": true, "requires": { "esbuild": "^0.25.0", + "fdir": "^6.4.4", "fsevents": "~2.3.3", + "picomatch": "^4.0.2", "postcss": "^8.5.3", - "rollup": "^4.30.1" + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "dependencies": { + "fdir": { + "version": "6.4.6", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.6.tgz", + "integrity": "sha512-hiFoqpyZcfNm1yc4u8oWCf9A2c4D3QjCrks3zmoVKVxpQRzmPNar1hUJcBG2RQHvEVGDN+Jm81ZheVLAQMK6+w==", + "dev": true, + "requires": {} + }, + "picomatch": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", + "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", + "dev": true + } } }, "vue": { @@ -5875,6 +6200,51 @@ "clipboard": "^2.0.4" } }, + "vue-markdown-render": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/vue-markdown-render/-/vue-markdown-render-2.2.1.tgz", + "integrity": "sha512-XkYnC0PMdbs6Vy6j/gZXSvCuOS0787Se5COwXlepRqiqPiunyCIeTPQAO2XnB4Yl04EOHXwLx5y6IuszMWSgyQ==", + "requires": { + "markdown-it": "^13.0.2" + }, + "dependencies": { + "entities": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-3.0.1.tgz", + "integrity": "sha512-WiyBqoomrwMdFG1e0kqvASYfnlb0lp8M5o5Fw2OFq1hNZxxcNk8Ik0Xm7LxzBhuidnZB/UtBqVCgUz3kBOP51Q==" + }, + "linkify-it": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/linkify-it/-/linkify-it-4.0.1.tgz", + "integrity": "sha512-C7bfi1UZmoj8+PQx22XyeXCuBlokoyWQL5pWSP+EI6nzRylyThouddufc2c1NDIcP9k5agmN9fLpA7VNJfIiqw==", + "requires": { + "uc.micro": "^1.0.1" + } + }, + "markdown-it": { + "version": "13.0.2", + "resolved": "https://registry.npmjs.org/markdown-it/-/markdown-it-13.0.2.tgz", + "integrity": "sha512-FtwnEuuK+2yVU7goGn/MJ0WBZMM9ZPgU9spqlFs7/A/pDIUNSOQZhUgOqYCficIuR2QaFnrt8LHqBWsbTAoI5w==", + "requires": { + "argparse": "^2.0.1", + "entities": "~3.0.1", + "linkify-it": "^4.0.1", + "mdurl": "^1.0.1", + "uc.micro": "^1.0.5" + } + }, + "mdurl": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/mdurl/-/mdurl-1.0.1.tgz", + "integrity": "sha512-/sKlQJCBYVY9Ers9hqzKou4H6V5UWc/M59TH2dvkt+84itfnq7uFOMLpOiOS4ujvHP4etln18fmIxA5R5fll0g==" + }, + "uc.micro": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/uc.micro/-/uc.micro-1.0.6.tgz", + "integrity": "sha512-8Y75pvTYkLJW2hWQHXxoqRgV7qb9B+9vFEtidML+7koHUFapnVJAZ6cKs+Qjz5Aw3aZWHMC6u0wJE3At+nSGwA==" + } + } + }, "vue3-json-editor": { "version": "1.1.5", "resolved": "https://registry.npmjs.org/vue3-json-editor/-/vue3-json-editor-1.1.5.tgz", diff --git a/package.json b/package.json index 5087d90..622f16d 100644 --- a/package.json +++ b/package.json @@ -21,12 +21,14 @@ "element-plus": "^2.4.4", "json-editor-vue3": "^1.1.1", "less": "^4.2.0", + "maptalks": "^1.1.3", "markdown-it": "^14.1.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", + "vue-markdown-render": "^2.2.1", "vue3-json-editor": "^1.1.5", "vue3-konami-code": "^1.0.0" }, diff --git a/src-tauri/aaa.iss b/src-tauri/aaa.iss deleted file mode 100644 index 2d0b7a5..0000000 --- a/src-tauri/aaa.iss +++ /dev/null @@ -1,12 +0,0 @@ -[Setup] -AppName=MyApp -AppVersion=1.0 -DefaultDirName={pf}\MyApp -OutputDir=. -OutputBaseFilename=MyAppInstaller - -[Files] -Source: "src-tauri/target/release/bundle/msi/*"; DestDir: "{app}"; Flags: ignoreversion recursesubdirs createallsubdirs - -[Run] -Filename: "{app}\path\to\vsruntime\installer.exe"; Parameters: "/quiet /norestart"; Flags: waituntilterminated \ No newline at end of file diff --git a/src-tauri/config.json b/src-tauri/config.json index 1cdb515..46fbff2 100644 --- a/src-tauri/config.json +++ b/src-tauri/config.json @@ -1 +1 @@ -{"pathofsave":null,"Filename":"testaa","caijiavgNumber":"1","useSG":false,"usehighpass":false,"Dispatcher":{"isenable":true,"begin":"06:25","end":"23:59"},"sensor_typeforset":"IS3"} \ No newline at end of file +{"pathofsave":"C:\\Program Files\\lucamtool","Filename":"testaa","caijiavgNumber":"1","useSG":false,"usehighpass":false,"Dispatcher":{"isenable":true,"begin":"06:25","end":"23:59"},"sensor_typeforset":"IS3"} \ No newline at end of file diff --git a/src-tauri/iris_data_example.iris b/src-tauri/iris_data_example.iris new file mode 100644 index 0000000..fc7637c Binary files /dev/null and b/src-tauri/iris_data_example.iris differ diff --git a/src-tauri/iris_is3lib.dll b/src-tauri/iris_is3lib.dll index bc2c847..e070ea1 100644 Binary files a/src-tauri/iris_is3lib.dll and b/src-tauri/iris_is3lib.dll differ diff --git a/src-tauri/src/irisdatamanager/mod.rs b/src-tauri/src/irisdatamanager/mod.rs new file mode 100644 index 0000000..0805713 --- /dev/null +++ b/src-tauri/src/irisdatamanager/mod.rs @@ -0,0 +1,189 @@ +use std::fmt::format; + +use chrono::Datelike; +use chrono::Timelike; +use serde_json::json; + +use crate::myformatiris::structures::*; +use crate::myformatiris::read::*; +use crate::myformatiris::write::*; + + + pub fn savecalibratefileIRIS(Gain:serde_json::Value,direction: bool, filepath: String, dndata: serde_json::Value, lampdata: serde_json::Value, devinfo: serde_json::Value) -> String { + //输出 输入参数 + //println!("Gain: {:?}", Gain); + // println!("direction: {:?}", direction); + // println!("Filepath: {:?}", devinfo); + // println!("DNData: {:?}", dndata); + // println!("Lampdata: {:?}", lampdata); + // println!("Devinfo: {:?}", devinfo); + let mut oneirisdata:OneIRISData = OneIRISData::new(); + let mut spectraldatagain: SpectralData= SpectralData::new(); + spectraldatagain.name= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&"_".to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string()+&"_gain".to_string(); + spectraldatagain.sensor_id= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string(); + spectraldatagain.bands= devinfo["bands"].as_u64().unwrap_or(0) as u16; + spectraldatagain.pixel_size=8; + spectraldatagain.data_type=DATA_TYPE_FLOAT64; + spectraldatagain.fiber_id=direction as u8; + spectraldatagain.exposure=Gain["shutter_time"].as_u64().unwrap_or(0) as f64; + spectraldatagain.gain=Gain["sensor_gain"].as_f64().unwrap_or(1.0) as f32; + let datenow = chrono::Local::now(); + let nowtiem= TimeStruct { + + time_zone:50, + year:datenow.year() as u16, + month:datenow.month() as u8, + day:datenow.day() as u8, + hour:datenow.hour() as u8, + minute:datenow.minute() as u8, + second:datenow.second() as u8, + millisecond:datenow.timestamp_subsec_millis() as u16, + }; + spectraldatagain.collection_time=nowtiem.clone(); + spectraldatagain.ground_type=Target_Spectral_Type_CaliFile_Gain; + spectraldatagain.valid_flag=1; + let spectraldatavec:Vec=Gain["Data"].as_array().unwrap_or(&vec![]).iter() + .map(|x| x.as_f64().unwrap_or(0.0)) + .collect::>(); + spectraldatagain.Set_Spectral_Data(spectraldatavec, DATA_TYPE_FLOAT64); + println!("spectraldata.name: {:?}", spectraldatagain.name); + oneirisdata.spectral_data_section.push(spectraldatagain); + let mut spectraldata_dn: SpectralData= SpectralData::new(); + spectraldata_dn.name= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&"_".to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string()+&"_dn".to_string(); + spectraldata_dn.sensor_id= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string(); + spectraldata_dn.bands= devinfo["bands"].as_u64().unwrap_or(0) as u16; + spectraldata_dn.pixel_size=8; + spectraldata_dn.fiber_id=direction as u8; + spectraldata_dn.exposure=dndata["shutter_time"].as_u64().unwrap_or(0) as f64; + spectraldata_dn.gain=dndata["gain"].as_f64().unwrap_or(1.0) as f32; + spectraldata_dn.data_type=DATA_TYPE_FLOAT64; + spectraldata_dn.collection_time=nowtiem.clone(); + spectraldata_dn.ground_type=Target_Spectral_Type_DN; + spectraldata_dn.valid_flag=1; + let spectraldatavec_dn:Vec=dndata["data"].as_array().unwrap_or(&vec![]).iter() + .map(|x| x.as_f64().unwrap_or(0.0)) + .collect::>(); + spectraldata_dn.Set_Spectral_Data(spectraldatavec_dn, DATA_TYPE_FLOAT64); + println!("spectraldata_dn.name: {:?}", spectraldata_dn.name); + oneirisdata.spectral_data_section.push(spectraldata_dn); + let mut spectraldata_lamp: SpectralData= SpectralData::new(); + let lampvalue= lampdata["value_lable"].as_str().unwrap_or("Unknown"); + let datalabel= lampdata["data_value"].as_str().unwrap_or("Unknown"); + spectraldata_lamp.name= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&"_".to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string()+&"_lamplable_".to_string()+&lampvalue.to_string()+&"_datalabel_".to_string()+&datalabel.to_string(); + spectraldata_lamp.sensor_id= devinfo["name"].as_str().unwrap_or("Unknown").to_string()+&devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string(); + let lampvalue_f64_vec= lampdata["data"].as_array().unwrap_or(&vec![]).iter() + .map(|x| x.as_f64().unwrap_or(0.0)) + .collect::>(); + spectraldata_lamp.Set_Spectral_Data(lampvalue_f64_vec, DATA_TYPE_FLOAT64); + spectraldata_lamp.ground_type=Target_LAMP_VALUE_SCALED; + oneirisdata.spectral_data_section.push(spectraldata_lamp); + + let spectraldata_devinfo= json!( + { + "info_type": "devinfo", // 0 for device info + "sensor_id": devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string(), + "wave_coeff": { + "a1": devinfo["bochangxishu"]["a1"].as_f64().unwrap_or(0.0), + "a2": devinfo["bochangxishu"]["a2"].as_f64().unwrap_or(0.0), + "a3": devinfo["bochangxishu"]["a3"].as_f64().unwrap_or(0.0), + "a4": devinfo["bochangxishu"]["a4"].as_f64().unwrap_or(0.0) + } + + } + ); + let environment_info= json!( + { + "info_type": "environment", // 1 for environment info + "date": format!("{}-{:02}-{:02} {:02}:{:02}:{:02}", + datenow.year(), + datenow.month(), + datenow.day(), + datenow.hour(), + datenow.minute(), + datenow.second() + ), + + + } + ); + /* + let spectraldata_devinfo= json!( + { + "info_type": "infolist", // 0 for device info + "info_number":3, + "info_list": [ + { + "info_type": "devinfo", // 0 for device info + "sensor_id": "is30002", + "bandnum": 2048, + "wave_coeff": { + "a1": 0.0, + "a2": 0.0, + "a3": 400, + "a4": 1.0 + } + }, + { + "info_type": "environment", // 1 for gain info + "date": "2000-01-00 00:00:00", + //下面可选 + "humidity":90.0, + "temperature":35.0 , + "gps":{ + "latitude":115.01, + "longitude": 39.01, + "altitude": 100.0 + }, + }, + { + "info_type": "devinfo", // 0 for device info + "sensor_id": "is20001", + "bandnum": 512, + "wave_coeff": { + "a1": 0, + "a2": 0.0, + "a3":390, + "a4": 4 + } + } + ] + + } + ); + */ + + // spectraldata_devinfo.sensor_id=devinfo["serialnumber"].as_str().unwrap_or("Unknown").to_string(); + // spectraldata_devinfo.wave_coeff[0]=devinfo["bochangxishu"]["a1"].as_f64().unwrap_or(0.0); + // spectraldata_devinfo.wave_coeff[1]=devinfo["bochangxishu"]["a2"].as_f64().unwrap_or(0.0); + // spectraldata_devinfo.wave_coeff[2]=devinfo["bochangxishu"]["a3"].as_f64().unwrap_or(0.0); + // spectraldata_devinfo.wave_coeff[3]=devinfo["bochangxishu"]["a4"].as_f64().unwrap_or(0.0); + + oneirisdata.spectral_info_section.push(spectraldata_devinfo); + oneirisdata.spectral_info_section.push(environment_info); + +// 修复后的代码 +let filesave_date = format!("{}_{:04}{:02}{:02}", + filepath, // 如果 filepath 是 String,这里会自动借用 + datenow.year(), + datenow.month(), + + datenow.day() +); +let filesavepath=filesave_date.clone()+".iris"; + + wirte_iris_data(&oneirisdata, &filesavepath); + + + + + + + + + + + + + "ok".to_string() + +} \ No newline at end of file diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 9f39639..8a2d993 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -1,6 +1,6 @@ // Prevents additional console window on Windows in release, DO NOT REMOVE!! #![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] - +mod irisdatamanager; mod algorithm; mod mylog; mod serport; @@ -8,12 +8,13 @@ mod iris_spectral; mod irishypersptral; mod mydefine; mod comman1; +mod myformatiris; use comman1::*; use algorithm::interpolate_spline; use algorithm::sg_smooth; use mydefine::*; use iris_spectral::spectralbase::Senortype; - +use myformatiris::getoneirisfile; enum DevName { IRIS_IS11, IRIS_SENSOR(Senortype), @@ -21,6 +22,7 @@ enum DevName { } use lazy_static::lazy_static; +use tauri::api::dir; use std::sync::Mutex; //设置一个可修改的全局变量 lazy_static! { @@ -42,6 +44,30 @@ lazy_static! { //println!("{}",readdatafromport(1000)); String::from("Port set ok") } +/* let data = { + gain: Gain, + direction: direction, + filepath: Filepath, + DNData: DNData, + LampData: Lampdata, + Devinfo: Devinfo + } */ +#[tauri::command] +fn savecalibratefileIRIS(Gain:serde_json::Value,direction: bool, filepath: String, dndata: serde_json::Value, lampdata: serde_json::Value, devinfo: serde_json::Value) -> String { + //输出 输入参数 + // println!("Gain: {:?}", Gain); + // println!("direction: {:?}", direction); + // println!("Filepath: {:?}", devinfo); + // println!("DNData: {:?}", dndata); + // println!("Lampdata: {:?}", lampdata); + // println!("Devinfo: {:?}", devinfo); + + + + irisdatamanager::savecalibratefileIRIS(Gain, direction, filepath, dndata, lampdata, devinfo) + +} + #[tauri::command] fn savecalibratefile(gain: Vec, shutter: u32, direction: bool, filepath: String) -> String { @@ -213,6 +239,7 @@ fn main() { interpolate_spline, sg_smooth, savecalibratefile, + savecalibratefileIRIS, sendcalibratetodev, setdevtype, set_weave_coeff, @@ -220,7 +247,8 @@ fn main() { algorithm::gaussian_filter_high, algorithm::interpolate_spline_at_points, algorithm::find_peek, - algorithm::compute_weave_coeff + algorithm::compute_weave_coeff, + getoneirisfile ]) .setup(|app| { diff --git a/src-tauri/src/myformatiris/mod.rs b/src-tauri/src/myformatiris/mod.rs new file mode 100644 index 0000000..2420939 --- /dev/null +++ b/src-tauri/src/myformatiris/mod.rs @@ -0,0 +1,16 @@ +pub mod structures; +pub mod read; +pub mod write; + + +pub use structures::{TimeStruct, SpectralData, ImageInfo, OneIRISData}; +pub use structures::*; +pub use read::{read_time, read_spectral_data, read_image_info, read_iris_file}; +pub use write::*; + +#[tauri::command] +pub fn getoneirisfile(path:String)->OneIRISData{ + let returndata=read_iris_file(&path).unwrap(); + return returndata; + +} \ No newline at end of file diff --git a/src-tauri/src/myformatiris/read.rs b/src-tauri/src/myformatiris/read.rs new file mode 100644 index 0000000..0486173 --- /dev/null +++ b/src-tauri/src/myformatiris/read.rs @@ -0,0 +1,343 @@ +use std::io::{Read, Result, BufReader}; +use std::fs::File; +use std::convert::TryInto; +use super::structures::{TimeStruct, SpectralData, ImageInfo, OneIRISData}; +// use serde::de::value; +use serde_json::Value; +pub fn read_time(reader: &mut R) -> Result { + let mut buffer = [0u8; 10]; // Corrected buffer size to 10 bytes + reader.read_exact(&mut buffer)?; + + Ok(TimeStruct { + time_zone: buffer[0] as i8, + year: u16::from_le_bytes([buffer[1], buffer[2]]), + month: buffer[3], + day: buffer[4], + hour: buffer[5], + minute: buffer[6], + second: buffer[7], + millisecond: u16::from_le_bytes([buffer[8], buffer[9]]), // Indices 8 and 9 are correct for 10-byte buffer + }) +} + + + +pub fn read_image_info(reader: &mut R) -> Result { + let mut info = ImageInfo::new(); + + // Read data length + let mut len_buf = [0u8; 8]; + reader.read_exact(&mut len_buf)?; + info.data_length = u64::from_le_bytes(len_buf); + + // Read name (fixed size 100 bytes) + let mut name_buf = [0u8; 100]; + reader.read_exact(&mut name_buf)?; + info.name = String::from_utf8_lossy(&name_buf).trim_end_matches('\0').to_string(); + info.name = remove_after_null_split_once(info.name); + + // Read collection time + info.collection_time = read_time(reader)?; + + // Read info type + let mut type_buf = [0u8; 1]; + reader.read_exact(&mut type_buf)?; + info.info_type = type_buf[0]; + let imagedatlenth= info.data_length as u64- 100-10-1; // Adjusted to account for the size of TimeStruct and info_type + // Read image data + info.image_data.resize(imagedatlenth as usize, 0); + reader.read_exact(&mut info.image_data)?; + + Ok(info) +} + +pub fn read_iris_file(path: &str) -> Result { + let file = File::open(path)?; + let mut reader = BufReader::new(file); + + // Read and verify magic number + // let mut magic = [0u8; 4]; + // reader.read_exact(&mut magic)?; + // if magic != [0x49, 0x52, 0x49, 0x53] { // "IRIS" in ASCII + // return Err(std::io::Error::new( + // std::io::ErrorKind::InvalidData, + // "Not a valid IRIS file" + // )); + // } + + let mut iris_data = OneIRISData::new(); + + // // Read file version + // let mut version = [0u8; 2]; + // reader.read_exact(&mut version)?; + + // Read sections until EOF + loop { + let mut section_header = [0u8; 12]; // type (4) + length (8) + if reader.read_exact(&mut section_header).is_err() { + break; // EOF reached + } + + let section_type = u32::from_le_bytes(section_header[0..4].try_into().unwrap()); + let section_length = u64::from_le_bytes(section_header[4..12].try_into().unwrap()); + + match section_type { + 0x00FF00FF => { // Spectral data section + let count = read_section_count(&mut reader)?; + let mut data = Vec::with_capacity(count); + for _ in 0..count { + data.push(read_spectral_data(&mut reader)?); + } + iris_data.spectral_data_section = data; + }, + 0xFF00FF00 => { // Spectral info section + let count = read_section_count(&mut reader)?; + let mut data = Vec::with_capacity(count); + for _ in 0..count { + let mut tempbuffer = [0u8; 3]; // Adjust size as needed + reader.read_exact(&mut tempbuffer)?; + let lenth = u16::from_le_bytes([tempbuffer[0],tempbuffer[1]]) as usize; + let datatype= u8::from_le_bytes([tempbuffer[2]]); + let mut tempvector = vec![0u8; lenth]; + reader.read_exact(&mut tempvector)?; + // Convert to String + let json_string = String::from_utf8(tempvector).unwrap_or_default(); + let json_string = json_string.trim_end_matches('\0').to_string(); + //print!("JSON String: {}", json_string); + let json:Value = match serde_json::from_str(&json_string){ + Ok(json) => json, + Err(e) => { + eprintln!("Error parsing JSON: {}", e); + continue; // Skip this entry if parsing fails + } + }; // Handle parsing error gracefully + + //判断json["info_type"]是否存在 + if !json.get("info_type").is_some() { + eprintln!("JSON does not contain 'info_type': {}", json_string); + continue; // Skip this entry if "info_type" is missing + } + /* { + "info_type": "infolist", // 0 for device info + "info_number":3, + "info_list": [ + { + "info_type": "devinfo", // 0 for device info + "sensor_id": "is30002", + "bandnum": 2048, + "wave_coeff": { + "a1": 0.0, + "a2": 0.0, + "a3": 400, + "a4": 1.0 + } + }, + { + "info_type": "environment", // 1 for gain info + "date": "2000-01-00 00:00:00", + //下面可选 + "humidity":90.0, + "temperature":35.0 , + "gps":{ + "latitude":115.01, + "longitude": 39.01, + "altitude": 100.0 + }, + }, + { + "info_type": "devinfo", // 0 for device info + "sensor_id": "is20001", + "bandnum": 512, + "wave_coeff": { + "a1": 0, + "a2": 0.0, + "a3":390, + "a4": 4 + } + } + ] + + } */ + //如果info_type是infolist 则需要逐个解析 + if json.get("info_type").and_then(Value::as_str) == Some("infolist") { + let info_number = json.get("info_number").and_then(Value::as_u64).unwrap_or(0) as usize; + for i in 0 ..info_number{ + //将对应的info加入到data中 + if let Some(info) = json.get("info_list").and_then(|list| list.get(i)) { + data.push(info.clone()); + } + + + } + + continue; // Skip the rest of the loop for this entry + } + + + + data.push(json); + //println!("Parsed JSON: {:?}", json); + // let mut data_entry = SpectralInfo::new(); + // data_entry.sensor_id = json.get("SensorId").and_then(Value::as_str).unwrap_or_default().to_string(); + // data_entry.wave_coeff[0]=json["WaveCoeff"]["a1"].as_f64().unwrap_or(0.0); + // data_entry.wave_coeff[1]=json["WaveCoeff"]["a2"].as_f64().unwrap_or(0.0); + // data_entry.wave_coeff[2]=json["WaveCoeff"]["a3"].as_f64().unwrap_or(0.0); + // data_entry.wave_coeff[3]=json["WaveCoeff"]["a4"].as_f64().unwrap_or(0.0); + // data.push(data_entry); + // Parse JSON string + + + + + } + iris_data.spectral_info_section = data; + }, + 0xF0F0F0F0 => { // Other info section + if section_length == 0 { + iris_data.other_info_section = Vec::new(); // Handle empty section + continue; // Skip empty section + } + let count = read_section_count(&mut reader)?; + let mut data = Vec::with_capacity(count); + for _ in 0..count { + let mut tempbuffer = [0u8; 3]; // Adjust size as needed + reader.read_exact(&mut tempbuffer)?; + let lenth = u16::from_le_bytes([tempbuffer[0], tempbuffer[1]]) as usize; + let info_type = u8::from_le_bytes([tempbuffer[2]]); + let mut tempvector = vec![0u8; lenth]; + reader.read_exact(&mut tempvector)?; + // Convert to String + let json_string = String::from_utf8(tempvector).unwrap_or_default(); + let json_string = json_string.trim_end_matches('\0').to_string(); + //print!("JSON String: {}", json_string); + let json: Value = match serde_json::from_str(&json_string) { + Ok(json) => json, + Err(e) => { + eprintln!("Error parsing JSON: {}", e); + continue; // Skip this entry if parsing fails + } + }; // Handle parsing error gracefully + data.push(json); + + } + iris_data.other_info_section = data; + }, + 0x0F0F0F0F => { // Image info section + if section_length== 0 { + iris_data.image_info_section= Vec::new(); // Handle empty section + continue; // Skip empty section + + } + let count = read_section_count(&mut reader)?; + let mut data = Vec::with_capacity(count); + for _ in 0..count { + data.push(read_image_info(&mut reader)?); + } + iris_data.image_info_section = data; + }, + _ => { + // Skip unknown sections + let mut buf = vec![0u8; section_length as usize]; + reader.read_exact(&mut buf)?; + } + } + } + + Ok(iris_data) +} + +fn read_section_count(reader: &mut R) -> Result { + let mut count_buf = [0u8; 2]; + reader.read_exact(&mut count_buf)?; + Ok(u16::from_le_bytes(count_buf) as usize) +} + +// pub fn read_other_info(reader: &mut R) -> Result { +// let mut info = OtherInfo::new(); + +// // Read info type +// let mut type_buf = [0u8; 1]; +// reader.read_exact(&mut type_buf)?; +// info.info_type = type_buf[0]; + +// // Read data length +// let mut len_buf = [0u8; 8]; +// reader.read_exact(&mut len_buf)?; +// let data_len = u64::from_le_bytes(len_buf) as usize; + +// // Read data +// info.data.resize(data_len, 0); +// reader.read_exact(&mut info.data)?; + +// Ok(info) +// } +fn remove_after_null_split_once(s: String) -> String { + if let Some((before_null, _after_null)) = s.split_once('\0') { + // 返回 \0 之前的部分 + before_null.to_string() + } else { + // 如果没有找到 \0,就返回原始 String + s + } +} +pub fn read_spectral_data(reader: &mut R) -> Result { + let mut data = SpectralData::new(); + + // Read fixed-size fields + let mut name_buf = [0u8; 100]; + + reader.read_exact(&mut name_buf)?; + name_buf[99] = 0; // Ensure null termination + let temp= String::from_utf8_lossy(&name_buf); + data.name = temp.trim_end_matches('\0').to_string(); + data.name = remove_after_null_split_once(data.name); + + let mut sensor_buf = [0u8; 50]; + reader.read_exact(&mut sensor_buf)?; + data.sensor_id = String::from_utf8_lossy(&sensor_buf).trim_end_matches('\0').to_string(); + data.sensor_id = remove_after_null_split_once(data.sensor_id); + let mut uint8_buf = [0u8; 1]; + + reader.read_exact(&mut uint8_buf)?; + data.fiber_id = uint8_buf[0]; + + + data.collection_time = read_time(reader)?; + + + let mut float_buf = [0u8; 8]; + reader.read_exact(&mut float_buf)?; + data.exposure = f64::from_le_bytes(float_buf); + + let mut float_buf = [0u8; 4]; + reader.read_exact(&mut float_buf)?; + data.gain = f32::from_le_bytes(float_buf); + + let mut byte_buf = [0u8; 1]; + reader.read_exact(&mut byte_buf)?; + data.data_type = byte_buf[0]; + + reader.read_exact(&mut byte_buf)?; + data.pixel_size = byte_buf[0]; + + reader.read_exact(&mut byte_buf)?; + data.ground_type = byte_buf[0]; + + let mut short_buf = [0u8; 2]; + reader.read_exact(&mut short_buf)?; + data.bands = u16::from_le_bytes(short_buf); + + reader.read_exact(&mut byte_buf)?; + data.valid_flag = byte_buf[0]; + let data_len=data.pixel_size as usize * data.bands as usize; + // Read the length of the spectral_data vector + // let mut len_buf = [0u8; 8]; + // reader.read_exact(&mut len_buf)?; + // let data_len = u64::from_le_bytes(len_buf) as usize; + + // Read the spectral_data vector + data.spectral_data.resize(data_len, 0); + reader.read_exact(&mut data.spectral_data)?; + + Ok(data) +} \ No newline at end of file diff --git a/src-tauri/src/myformatiris/structures.rs b/src-tauri/src/myformatiris/structures.rs new file mode 100644 index 0000000..584e4f2 --- /dev/null +++ b/src-tauri/src/myformatiris/structures.rs @@ -0,0 +1,411 @@ + +pub const DATA_TYPE_UINT8: u8 = 0x10; +pub const DATA_TYPE_INT16: u8 = 0x11; +pub const DATA_TYPE_UINT16: u8 = 0x12; +pub const DATA_TYPE_INT32: u8 = 0x13; +pub const DATA_TYPE_UINT32: u8 = 0x14; +pub const DATA_TYPE_FLOAT32: u8 = 0x20; +pub const DATA_TYPE_FLOAT64: u8 = 0x21; + +/* 0 dn 1 rad 2 ref 3 irad 4 califile 5 flat_ref 6 dark_dn 7 flat_dn */ + +pub const Target_Spectral_Type_DN:u8 = 0x00; +pub const Target_Spectral_Type_Rad:u8 = 0x01; +pub const Target_Spectral_Type_Ref:u8 = 0x02; +pub const Target_Spectral_Type_IRad:u8 = 0x03; +pub const Target_Spectral_Type_CaliFile_Gain:u8 = 0x04; +pub const Target_Spectral_Type_FlatRef:u8 = 0x05; +pub const Target_Spectral_Type_DarkDN:u8 = 0x06; +pub const Target_Spectral_Type_FlatDN:u8 = 0x07; +pub const Target_LAMP_VALUE_SCALED:u8 = 0x08; + +use serde::Serialize; +use serde_json::json; + + + +#[derive(serde::Serialize,Debug, Clone, PartialEq)] +pub struct TimeStruct { + pub time_zone: i8, + pub year: u16, + pub month: u8, + pub day: u8, + pub hour: u8, + pub minute: u8, + pub second: u8, + pub millisecond: u16, +} + +impl TimeStruct { + pub fn new() -> Self { + TimeStruct { + time_zone: 0, + year: 0, + month: 1, + day: 1, + hour: 0, + minute: 0, + second: 0, + millisecond: 0, + } + } +} + +#[derive(serde::Serialize,Debug, Clone, PartialEq)] +pub struct SpectralData { + pub name: String, + pub sensor_id: String, + pub fiber_id: u8, + pub collection_time: TimeStruct, + pub exposure: f64, + pub gain: f32, + pub data_type: u8, + pub pixel_size: u8, + pub ground_type: u8, + pub bands: u16, + pub valid_flag: u8, + pub spectral_data: Vec, +} + +impl SpectralData { + pub fn new() -> Self { + SpectralData { + name: String::new(), + sensor_id: String::new(), + fiber_id:0, + collection_time: TimeStruct::new(), + exposure: 0.0, + gain: 0.0, + data_type: 0, + pixel_size: 0, + ground_type: 0, + bands: 0, + valid_flag: 0, + spectral_data: Vec::new(), + } + } + + pub fn Get_Spectral_Data(&self)-> Vec { + let mut retrun_data: Vec = Vec::new(); + let datatype = self.data_type; + let bands = self.bands as usize; + match datatype { + DATA_TYPE_UINT8 => { + // uint8 + for i in 0..bands { + retrun_data.push(self.spectral_data[i] as f64); + } + + + + + } + DATA_TYPE_INT16 => { + // int16 + self.spectral_data.chunks(2).for_each(|chunk| { + if chunk.len() == 2 { + let value = i16::from_le_bytes([chunk[0], chunk[1]]); + retrun_data.push(value as f64); + } + }); + + } + DATA_TYPE_UINT16 => { + // uint16 + self.spectral_data.chunks(2).for_each(|chunk| { + if chunk.len() == 2 { + let value = u16::from_le_bytes([chunk[0], chunk[1]]); + retrun_data.push(value as f64); + } + }); + + } + DATA_TYPE_INT32 => { + // int32 + + + self.spectral_data.chunks(4).for_each(|chunk| { + if chunk.len() == 4 { + let value = i32::from_le_bytes([ + chunk[0], + chunk[1], + chunk[2], + chunk[3], + ]); + retrun_data.push(value as f64); + } + }); + + } + DATA_TYPE_UINT32 => { + // uint32 + for i in (0..self.spectral_data.len()).step_by(4) { + let value = u32::from_le_bytes([ + self.spectral_data[i], + self.spectral_data[i + 1], + self.spectral_data[i + 2], + self.spectral_data[i + 3], + ]); + retrun_data.push(value as f64); + } + } + DATA_TYPE_FLOAT32 => { + // float32 + for i in (0..self.spectral_data.len()).step_by(4) { + let value = f32::from_le_bytes([ + self.spectral_data[i], + self.spectral_data[i + 1], + self.spectral_data[i + 2], + self.spectral_data[i + 3], + ]); + retrun_data.push(value as f64); + } + } + DATA_TYPE_FLOAT64 => { + // float64 + for i in (0..self.spectral_data.len()).step_by(8) { + let value = f64::from_le_bytes([ + self.spectral_data[i], + self.spectral_data[i + 1], + self.spectral_data[i + 2], + self.spectral_data[i + 3], + self.spectral_data[i + 4], + self.spectral_data[i + 5], + self.spectral_data[i + 6], + self.spectral_data[i + 7], + ]); + retrun_data.push(value); + } + } + _ => { + // Unsupported data type + panic!("Unsupported data type: {}", datatype); + } + } + + + + retrun_data + + + } + pub fn Set_Spectral_Data(&mut self, data: Vec,datatype: u8) { + self.data_type = datatype; + self.bands = data.len() as u16; + self.spectral_data.clear(); + + // let datatype = self.data_type; + let bands = self.bands as usize; + match datatype { + DATA_TYPE_UINT8 => { + // uint8 + self.pixel_size = 1; + self.spectral_data.clear(); + for i in 0..bands { + if i < data.len() { + self.spectral_data.push(data[i] as u8); + } else { + self.spectral_data.push(0); + } + } + } + DATA_TYPE_INT16 => { + // int16 + self.pixel_size = 2; + self.spectral_data.clear(); + for i in 0..bands { + if i < data.len() { + let value = data[i] as i16; + self.spectral_data.extend_from_slice(&value.to_le_bytes()); + } else { + self.spectral_data.extend_from_slice(&[0, 0]); + } + } + } + DATA_TYPE_UINT16 => { + // uint16 + self.pixel_size = 2; + self.spectral_data.clear(); + for i in 0..bands { + if i < data.len() { + let value = data[i] as u16; + self.spectral_data.extend_from_slice(&value.to_le_bytes()); + } else { + self.spectral_data.extend_from_slice(&[0, 0]); + } + } + } + DATA_TYPE_INT32 => { + // int32 + self.pixel_size = 4; + self.spectral_data.clear(); + for i in 0..bands { + if i < data.len() { + let value = data[i] as i32; + self.spectral_data.extend_from_slice(&value.to_le_bytes()); + } else { + self.spectral_data.extend_from_slice(&[0, 0, 0, 0]); + } + } + } + DATA_TYPE_UINT32 => { + // uint32 + self.pixel_size = 4; + self.spectral_data.clear(); + for i in 0..bands { + if i < data.len() { + let value = data[i] as u32; + self.spectral_data.extend_from_slice(&value.to_le_bytes()); + } else { + self.spectral_data.extend_from_slice(&[0, 0, 0, 0]); + } + } + } + DATA_TYPE_FLOAT32 => { + // float32 + self.pixel_size = 4; + self.spectral_data.clear(); + for i in 0..bands { + if i < data.len() { + let value = data[i] as f32; + self.spectral_data.extend_from_slice(&value.to_le_bytes()); + } else { + self.spectral_data.extend_from_slice(&[0, 0, 0, 0]); + } + } + } + DATA_TYPE_FLOAT64 => { + // float64 + self.pixel_size = 8; + self.spectral_data.clear(); + for i in 0..bands { + if i < data.len() { + let value = data[i]; + self.spectral_data.extend_from_slice(&value.to_le_bytes()); + } else { + self.spectral_data.extend_from_slice(&[0, 0, 0, 0, 0, 0, 0, 0]); + } + } + } + _ => { + // Unsupported data type + panic!("Unsupported data type: {}", datatype); + } + } + + } +} + +// #[derive(Debug, Clone, PartialEq)] +// pub struct OtherInfo { +// pub info_type: u8, +// pub data: Vec, // Assuming the data is variable length +// } + +// impl OtherInfo { +// pub fn new() -> Self { +// OtherInfo { +// info_type: 0, +// data: Vec::new(), +// } +// } +// } +#[derive(serde::Serialize, Debug, Clone, PartialEq)] +pub struct OneIRISData { + pub spectral_data_section: Vec, + pub spectral_info_section: Vec, // Using serde_json::Value for flexibility + pub other_info_section: Vec, + pub image_info_section: Vec, +} + +impl OneIRISData { + pub fn new() -> Self { + OneIRISData { + spectral_data_section: Vec::new(), + spectral_info_section: Vec::new(), + other_info_section: Vec::new(), + image_info_section: Vec::new(), + } + } +} + +// #[derive(Debug, Clone, PartialEq)] +// pub struct SpectralInfo { +// pub sensor_id: String, +// pub wave_coeff: [f64; 4], + +// } + +// impl SpectralInfo { +// pub fn new() -> Self { +// SpectralInfo { +// sensor_id: String::new(), +// wave_coeff: [0.0; 4], +// } +// } +// } + +#[derive(serde::Serialize,Debug, Clone, PartialEq)] +pub struct ImageInfo { + pub data_length: u64, + pub name: String, + pub collection_time: TimeStruct, + pub info_type: u8, + pub image_data: Vec, // Assuming the data is variable length +} + +impl ImageInfo { + pub fn new() -> Self { + ImageInfo { + data_length: 0, + name: String::new(), + collection_time: TimeStruct::new(), + info_type: 0, + image_data: Vec::new(), + } + } +} + + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_time_struct() { + let time = TimeStruct::new(); + assert_eq!(time.time_zone, 0); + assert_eq!(time.year, 0); + assert_eq!(time.month, 1); + } + + #[test] + fn test_spectral_data() { + let data = SpectralData::new(); + assert_eq!(data.name, ""); + assert_eq!(data.bands, 0); + assert!(data.spectral_data.is_empty()); + } + + // #[test] + // fn test_spectral_info() { + // let info = SpectralInfo::new(); + // assert_eq!(info.sensor_id, ""); + // assert_eq!(info.wave_coeff, [0.0; 4]); + // } + + // #[test] + // fn test_other_info() { + // let info = OtherInfo::new(); + // assert_eq!(info.info_type, 0); + // assert!(info.data.is_empty()); + // } + + #[test] + fn test_image_info() { + let info = ImageInfo::new(); + assert_eq!(info.data_length, 0); + assert_eq!(info.name, ""); + assert!(info.image_data.is_empty()); + } +} \ No newline at end of file diff --git a/src-tauri/src/myformatiris/write.rs b/src-tauri/src/myformatiris/write.rs new file mode 100644 index 0000000..20d0eb7 --- /dev/null +++ b/src-tauri/src/myformatiris/write.rs @@ -0,0 +1,222 @@ +use std::fs::File; +use std::io::{self, Write, Result}; +use std::vec; +use serde_json::json; + +// use crate::write; + +use super::structures::{TimeStruct, SpectralData, ImageInfo,OneIRISData}; + +// Internal writer functions remain the same +fn write_time(time: &TimeStruct, writer: &mut W) -> Result<()> { + writer.write_all(&[time.time_zone as u8])?; + writer.write_all(&time.year.to_le_bytes())?; + writer.write_all(&[time.month])?; + writer.write_all(&[time.day])?; + writer.write_all(&[time.hour])?; + writer.write_all(&[time.minute])?; + writer.write_all(&[time.second])?; + writer.write_all(&time.millisecond.to_le_bytes())?; + Ok(()) +} + + +pub fn write_image_info(info: &ImageInfo, writer: &mut W) -> Result<()> { + // Write data length + writer.write_all(&info.data_length.to_le_bytes())?; + + // Write name (fixed size 100 bytes) + let mut name_buf = [0u8; 100]; + let name_bytes = info.name.as_bytes(); + name_buf[..info.name.len().min(99)].copy_from_slice(name_bytes[0..name_bytes.len().min(99)].as_ref()); + writer.write_all(&name_buf)?; + + // Write collection time + write_time(&info.collection_time, writer)?; + + // Write info type + writer.write_all(&[info.info_type])?; + + // Write image data + writer.write_all(&info.image_data)?; + + Ok(()) +} + + + +pub fn write_spectral_data(data: &SpectralData, writer: &mut W) -> Result<()> { + // Write fixed-size fields + let mut name_buf = [0u8; 100]; + + let namebyte= data.name.as_bytes(); + name_buf[..data.name.len().min(99)].copy_from_slice(namebyte[0..namebyte.len().min(99)].as_ref()); + writer.write_all(&name_buf)?; + + let mut sensor_buf = [0u8; 50]; + let sensor_id_bytes = data.sensor_id.as_bytes(); + sensor_buf[..data.sensor_id.len().min(49)].copy_from_slice(sensor_id_bytes[0..sensor_id_bytes.len().min(49)].as_ref()); + writer.write_all(&sensor_buf)?; + writer.write_all(&[data.fiber_id])?; + + write_time(&data.collection_time, writer)?; + writer.write_all(&data.exposure.to_le_bytes())?; + writer.write_all(&data.gain.to_le_bytes())?; + writer.write_all(&[data.data_type])?; + writer.write_all(&[data.pixel_size])?; + writer.write_all(&[data.ground_type])?; + writer.write_all(&data.bands.to_le_bytes())?; + writer.write_all(&[data.valid_flag])?; + + // // Write the length of the spectral_data vector + // writer.write_all(&(data.spectral_data.len() as u64).to_le_bytes())?; + // Write the spectral_data vector + writer.write_all(&data.spectral_data)?; + + Ok(()) +} +pub fn caculate_spectral_data_length(data: &Vec) -> u64 { + let mut lenth:u64 = 0; + //加上u16的长度 + lenth += 2; // bands + //加上u8的长度 + // let numberofspectral=data.len(); + for datatemp in data { + lenth += 100; // name + lenth += 50; // sensor_id + lenth += 1 ; // fiber_id + lenth += 10; // time_zone + lenth += 8; // exposure + lenth += 4; // gain + lenth += 1; // data_type + lenth += 1; // pixel_size + lenth += 1; // ground_type + lenth += 2; // bands + lenth += 1; // valid_flag + lenth += datatemp.spectral_data.len() as u64; + + } + lenth + +} +pub fn caculate_image_info_length(data: &Vec) -> u64 { + let mut lenth: u64 = 0; + if data.is_empty() { + return lenth; + } + lenth +=2; + for info in data { + lenth += 8; // data_length + lenth += 100; // name + lenth += 10; // time_zone + lenth += 1; // info_type + lenth += info.image_data.len() as u64; // image_data length + } + lenth +} + + +pub fn cacluate_other_info_length(data: &Vec) -> (Vec, u64) { + let mut lenth: u64 = 0; + let mut vecback= Vec::new(); + if data.is_empty() { + return (vecback, lenth); + } + // for info in data { + // lenth+=1; // info_type + // lenth+=8; // data length + // lenth += info.data.len() as u64; // data length + // vecback.push(info.info_type); + // vecback.extend_from_slice(&(info.data.len() as u64).to_le_bytes()); + // vecback.extend_from_slice(&info.data); + // } + (vecback, lenth) +} + +pub fn caculate_spectral_info_length(data: &Vec) -> (Vec, u64) { + let mut lenth: u64 = 0; + let mut vecback= Vec::new(); + if data.is_empty() { + return (vecback, lenth); + } + + + + lenth+=2; // sensor_id + let lenthofinfo=data.len() as u16; + vecback.extend_from_slice(&lenthofinfo.to_le_bytes()); // Number of spectral info entries + + + for info in data { + lenth+=2; + lenth+=1; + let mut lenthofthisinfo:u16=0; + let json=info; + let json_string = serde_json::to_string(&json).unwrap(); + let json_bytes = json_string.as_bytes(); + lenthofthisinfo= json_bytes.len() as u16+1; + lenth += lenthofthisinfo as u64 ; + + // 将长度转换为字节并添加到 vecback + vecback.extend_from_slice(&lenthofthisinfo.to_le_bytes()); + vecback.push(0x00); // json 标识 + vecback.extend_from_slice(json_bytes); + vecback.push(0x00); // 添加一个字节的0x00 + } + (vecback, lenth) + +} +pub fn wirte_iris_data(data:&OneIRISData,filepath:&str) -> Result<()> { + let mut file = File::create(filepath)?; + //写入光谱数据header + let SPectralData_Flag:u32=0x00FF00FF; + file.write_all(&SPectralData_Flag.to_le_bytes())?; + let mut sectionlenth: u64 = caculate_spectral_data_length(&data.spectral_data_section); + file.write_all(&(sectionlenth).to_le_bytes())?; // Section length + let numberofspectral=data.spectral_data_section.len() as u16; + file.write_all(&numberofspectral.to_le_bytes())?; // Number of spectral data entries + // Write spectral data section + for spectral_data in &data.spectral_data_section { + write_spectral_data(spectral_data, &mut file)?; + } + + // Write section length + + // Write spectral info section + let spectral_info_flag: u32 = 0xFF00FF00; + + + let (spectral_info_vec, spectral_info_length) = caculate_spectral_info_length(&data.spectral_info_section); + file.write_all(&spectral_info_flag.to_le_bytes())?; // Spectral info 区块标识 + file.write_all(&spectral_info_length.to_le_bytes())?; // Section length + if spectral_info_length != 0 { + file.write_all(&spectral_info_vec)?; // Write the spectral info section data + + } + + let other_info_flag: u32 = 0xF0F0F0F0; + let (other_info_vec, other_info_length) = cacluate_other_info_length(&data.other_info_section); + file.write_all(&other_info_flag.to_le_bytes())?; // Other info 区块标识 + file.write_all(&other_info_length.to_le_bytes())?; // Section length + if other_info_length != 0 { + file.write_all(&other_info_vec)?; // Write the other info section data + } + + + + let image_info_flag: u32 = 0x0F0F0F0F; + file.write_all(&image_info_flag.to_le_bytes())?; // Image info 区块标识 + let image_info_length = caculate_image_info_length(&data.image_info_section); + file.write_all(&image_info_length.to_le_bytes())?; // Section length + if image_info_length != 0 { + let numberofimageinfo = data.image_info_section.len() as u16; + file.write_all(&numberofimageinfo.to_le_bytes())?; // Write the image info section data + // Write image info section + for image_info in &data.image_info_section { + write_image_info(image_info, &mut file)?; + } + } + + + Ok(()) +} \ No newline at end of file diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 6e6f575..f8ea312 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -10,7 +10,7 @@ "package": { "productName": "SpectralPlot", - "version": "0.6.62" + "version": "0.6.66" }, "tauri": { diff --git a/src-tauri/updatelog.md b/src-tauri/updatelog.md new file mode 100644 index 0000000..ccdb3e7 --- /dev/null +++ b/src-tauri/updatelog.md @@ -0,0 +1,20 @@ +# IRIS SpectralPlot 更新日志 + +--- + +## 公司信息 + +* **公司名称**:北京依锐思遥感技术有限公司 +* **官方网站**:[http://www.iris-rs.cn](http://www.iris-rs.cn) +* **联系邮箱**:renlixin@iris-rs.cn + +--- + +## 更新日志 + +* **v0.6.58** 增加了IS3的支持。 +* **v0.6.59** 将连续保存功能分割为“连续(不保存)”和“连续保存”两个独立功能。 +* **v0.6.60** 增加了IS3快门的控制功能。 +* **v0.6.62** 修正了保存逻辑,并修复了波长倒置的问题。 +* **v0.6.65** 增加了HH3定标功能。 +* **v0.6.66** 增加了HH3波长定标所需的波长参数,并将寻峰最小值调整为3000。 diff --git a/src/App.vue b/src/App.vue index ba7f522..efab979 100644 --- a/src/App.vue +++ b/src/App.vue @@ -1,26 +1,48 @@ - diff --git a/src/AppHyperSpectral.vue b/src/AppHyperSpectral.vue index 664c4fc..1a79e67 100644 --- a/src/AppHyperSpectral.vue +++ b/src/AppHyperSpectral.vue @@ -119,6 +119,7 @@ export default {