From 34f29547c8d540eb71c7b3569005c69d171115a8 Mon Sep 17 00:00:00 2001 From: Anton Frank Date: Fri, 9 Jan 2026 12:08:05 -0600 Subject: [PATCH 1/5] Display magnetic field data from influxDB onto orientation page Magnetic Field data is currently displayed, although not correctly styled and displayed --- client/package-lock.json | 27 +--------- client/src/api/orientation.js | 30 +++++++++++ client/src/pages/OrientationTab.js | 65 ++++++++++++++++++++--- server/package-lock.json | 5 +- tools/telemetryInputCli/package-lock.json | 6 +++ 5 files changed, 97 insertions(+), 36 deletions(-) create mode 100644 client/src/api/orientation.js create mode 100644 tools/telemetryInputCli/package-lock.json diff --git a/client/package-lock.json b/client/package-lock.json index 4470cef..c76560d 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -73,7 +73,6 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -729,7 +728,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1613,7 +1611,6 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", @@ -2442,7 +2439,6 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2486,7 +2482,6 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -3951,7 +3946,6 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", "license": "MIT", - "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/core-downloads-tracker": "^5.18.0", @@ -5158,7 +5152,6 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "license": "MIT", - "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -5310,7 +5303,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -5364,7 +5356,6 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "license": "BSD-2-Clause", - "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -5734,7 +5725,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5833,7 +5823,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6797,7 +6786,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -8767,7 +8755,6 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -11615,7 +11602,6 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "license": "MIT", - "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -14264,7 +14250,6 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", - "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -15691,7 +15676,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -16826,7 +16810,6 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", - "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17192,7 +17175,6 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -17343,7 +17325,6 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", - "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -17369,7 +17350,6 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", "license": "MIT", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -17905,7 +17885,6 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "license": "MIT", - "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -18204,7 +18183,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -19890,7 +19868,6 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "license": "(MIT OR CC0-1.0)", - "peer": true, "engines": { "node": ">=10" }, @@ -20323,7 +20300,6 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", "license": "MIT", - "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -20395,7 +20371,6 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "license": "MIT", - "peer": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -20808,7 +20783,6 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", - "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21198,6 +21172,7 @@ "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", "license": "BSD-3-Clause", + "peer": true, "dependencies": { "tslib": "2.3.0" } diff --git a/client/src/api/orientation.js b/client/src/api/orientation.js new file mode 100644 index 0000000..f1f3365 --- /dev/null +++ b/client/src/api/orientation.js @@ -0,0 +1,30 @@ +// API functions for the Experiment tab + +import { fetchData } from './api'; +import { dateToRFC } from './utils'; + +const NUMBER_OF_VARIANTS = 2; + +const queryMagFieldData = async (start, end) => { + let endpoint = `adcs/magf` + + const params = new URLSearchParams({start: dateToRFC(start), end: dateToRFC(end)}) + + const requests = Array.from({ length: NUMBER_OF_VARIANTS }, (_, i) => + fetchData(`${endpoint}/${i + 1}?${params.toString()}`), + ); + + const responses = await Promise.all(requests); + const magFieldDataArray = []; + + return responses.map((magfieldData) => + magfieldData.map(item => [item.variant, item.timestamp, item.X, item.Y, item.Z]), + console.log(responses.length) + ); +} + +export const fetchMagneticField = async (start, end) => { + + const magnetic = await queryMagFieldData(start, end); + return { magnetic }; +}; diff --git a/client/src/pages/OrientationTab.js b/client/src/pages/OrientationTab.js index c52053e..0606a5f 100644 --- a/client/src/pages/OrientationTab.js +++ b/client/src/pages/OrientationTab.js @@ -1,9 +1,62 @@ -import React from 'react'; +import React, { useState, useEffect } from 'react'; +import { useQuery } from '@tanstack/react-query'; +import { fetchMagneticField, fetchMagField } from '../api/orientation.js'; +import Box from '@mui/material/Box'; +import FormControlLabel from '@mui/material/FormControlLabel'; +import Switch from '@mui/material/Switch'; +import TimeseriesChart from '../components/TimeseriesChart.jsx'; +import { useTimeContext } from "../components/TimeRangeContext.jsx"; +import { testTemperatureData, testLuminosityData, testWellActivity } from '../api/testData.js'; -class OrientationTab extends React.Component { - render() { - return null; - } +const CHART_WIDTH = 800; + +const chartSize = { + width: CHART_WIDTH, + height: 400 } -export default OrientationTab; \ No newline at end of file +export default function OrientationTab() { + const { timeRange } = useTimeContext(); + const [magneticData, setMagneticData] = useState([]); + + useEffect(() => { + const load = async () => { + const start = new Date('2025-09-01T00:00:00Z'); + const end = new Date('2025-09-10T00:00:00Z'); + + const { magnetic } = await fetchMagneticField(start, end); + console.log('fetchMagneticField result:', magnetic); + setMagneticData(magnetic); + } + load().catch(console.error); + }, []); + + const displayMagneticFieldData = () => { + + }; + + // WORK IN PROGRESS + + return ( + + +
+ Magnetic Field Data +
+

VARIANT: {JSON.stringify(magneticData)}

+

TIMESTAMP

+

X

+

Y

+

Z

+ +
+ {magneticData.length === 0 ? ( +

No Data

+ ) : ( +
{JSON.stringify(magneticData, null, 2)}
+ )} +
+
+
+ ); +} \ No newline at end of file diff --git a/server/package-lock.json b/server/package-lock.json index 31f5ff2..cc5f287 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -202,8 +202,7 @@ "node_modules/@influxdata/influxdb-client": { "version": "1.35.0", "resolved": "https://registry.npmjs.org/@influxdata/influxdb-client/-/influxdb-client-1.35.0.tgz", - "integrity": "sha512-woWMi8PDpPQpvTsRaUw4Ig+nOGS/CWwAwS66Fa1Vr/EkW+NEwxI8YfPBsdBMn33jK2Y86/qMiiuX/ROHIkJLTw==", - "peer": true + "integrity": "sha512-woWMi8PDpPQpvTsRaUw4Ig+nOGS/CWwAwS66Fa1Vr/EkW+NEwxI8YfPBsdBMn33jK2Y86/qMiiuX/ROHIkJLTw==" }, "node_modules/@influxdata/influxdb-client-apis": { "version": "1.35.0", @@ -242,7 +241,6 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -611,7 +609,6 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz", "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", "dev": true, - "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", diff --git a/tools/telemetryInputCli/package-lock.json b/tools/telemetryInputCli/package-lock.json new file mode 100644 index 0000000..ec41b6c --- /dev/null +++ b/tools/telemetryInputCli/package-lock.json @@ -0,0 +1,6 @@ +{ + "name": "telemetryInputCli", + "lockfileVersion": 3, + "requires": true, + "packages": {} +} From a970b396b132063fd29b38c7bff0581256ee9fea Mon Sep 17 00:00:00 2001 From: Anton Frank Date: Wed, 14 Jan 2026 13:37:28 -0600 Subject: [PATCH 2/5] Rough code on code output --- client/src/pages/OrientationTab.js | 57 +++++++++++++++++++++++++----- server/package-lock.json | 5 ++- 2 files changed, 53 insertions(+), 9 deletions(-) diff --git a/client/src/pages/OrientationTab.js b/client/src/pages/OrientationTab.js index 0606a5f..7db09d6 100644 --- a/client/src/pages/OrientationTab.js +++ b/client/src/pages/OrientationTab.js @@ -10,6 +10,8 @@ import { testTemperatureData, testLuminosityData, testWellActivity } from '../ap const CHART_WIDTH = 800; +let magDataArray = []; + const chartSize = { width: CHART_WIDTH, height: 400 @@ -18,6 +20,11 @@ const chartSize = { export default function OrientationTab() { const { timeRange } = useTimeContext(); const [magneticData, setMagneticData] = useState([]); + let magVariant = []; + let magTime = []; + let magX = []; + let magY = []; + let magZ = []; useEffect(() => { const load = async () => { @@ -26,13 +33,48 @@ export default function OrientationTab() { const { magnetic } = await fetchMagneticField(start, end); console.log('fetchMagneticField result:', magnetic); + console.log('fetchMagneticField array 1 result: ', magnetic[0]) + console.log('fetchMagneticField array x result: ', magnetic[0][0][0]) + + // variant -> timestamp -> X -> Y -> Z + for (let i = 0; i < magnetic.length; i++) { + for (let j = 0; j < magnetic[i].length; j++) { + const value = magnetic[i][j]; + console.log('magvariant size: ', magVariant.length); + magVariant.push(magnetic[i][j][0]); + magTime.push(magnetic[i][j][1]); + magX.push(magnetic[i][j][2]); + magY.push(magnetic[i][j][3]); + magZ.push(magnetic[i][j][4]); + } + } + setMagneticData(magnetic); - } + + console.log('magneticData size: ', magneticData.length) + for (let i = 0; i < magneticData.length; i++) { + for (let j = 0; j < magneticData[i].length; j++) { + magDataArray.push(magneticData[i][j]); + } + + console.log('magData Length: ', magDataArray.length) + } + + for (let i = 0; i < magDataArray.length; i++) { + console.log('mag data array: ', magDataArray[i]) + } + } load().catch(console.error); }, []); const displayMagneticFieldData = () => { - + for (let i = 0; i <= magDataArray.length; i++) { + for (let j = 0; j <= magDataArray[i]; j++) + { + console.log('here ', magDataArray[i][0]) + return magDataArray[i][j]; + } + } }; // WORK IN PROGRESS @@ -43,13 +85,12 @@ export default function OrientationTab() {
Magnetic Field Data
-

VARIANT: {JSON.stringify(magneticData)}

-

TIMESTAMP

-

X

-

Y

-

Z

- +

+ VARIANT: + {magneticData[1][1]} +

+ Data {magneticData.length === 0 ? (

No Data

) : ( diff --git a/server/package-lock.json b/server/package-lock.json index cc5f287..31f5ff2 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -202,7 +202,8 @@ "node_modules/@influxdata/influxdb-client": { "version": "1.35.0", "resolved": "https://registry.npmjs.org/@influxdata/influxdb-client/-/influxdb-client-1.35.0.tgz", - "integrity": "sha512-woWMi8PDpPQpvTsRaUw4Ig+nOGS/CWwAwS66Fa1Vr/EkW+NEwxI8YfPBsdBMn33jK2Y86/qMiiuX/ROHIkJLTw==" + "integrity": "sha512-woWMi8PDpPQpvTsRaUw4Ig+nOGS/CWwAwS66Fa1Vr/EkW+NEwxI8YfPBsdBMn33jK2Y86/qMiiuX/ROHIkJLTw==", + "peer": true }, "node_modules/@influxdata/influxdb-client-apis": { "version": "1.35.0", @@ -241,6 +242,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.0.tgz", "integrity": "sha512-cl669nCJTZBsL97OF4kUQm5g5hC2uihk0NxY3WENAC0TYdILVkAyHymAntgxGkl7K+t0cXIrH5siy5S4XkFycA==", "dev": true, + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -609,6 +611,7 @@ "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.21.0.tgz", "integrity": "sha512-KjeihdFqTPhOMXTt7StsDxriV4n66ueuF/jfPNC3j/lduHwr/ijDwJMsF+wyMJethgiKi5wniIE243vi07d3pg==", "dev": true, + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.12.1", From 7f99600b8f7680137ded5e83d1ab38339cae5a7f Mon Sep 17 00:00:00 2001 From: Anton Frank Date: Thu, 29 Jan 2026 08:42:08 -0600 Subject: [PATCH 3/5] ADCS data is now displayed on JARVIS --- client/package-lock.json | 27 +++- client/package.json | 2 +- client/src/api/orientation.js | 25 +++- client/src/pages/OrientationTab.js | 217 ++++++++++++++++++++++------- server/Dockerfile | 2 +- server/config/env.js | 2 +- server/docker-compose.yaml | 2 +- server/package-lock.json | 50 ++++--- server/package.json | 2 +- 9 files changed, 254 insertions(+), 75 deletions(-) diff --git a/client/package-lock.json b/client/package-lock.json index c76560d..4470cef 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -73,6 +73,7 @@ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.4.tgz", "integrity": "sha512-2BCOP7TN8M+gVDj7/ht3hsaO/B/n5oDbiAyyvnRlNOs+u1o+JWNYTQrmpuNp1/Wq2gcFrI01JAW+paEKDMx/CA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/code-frame": "^7.27.1", "@babel/generator": "^7.28.3", @@ -728,6 +729,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.27.1.tgz", "integrity": "sha512-p9OkPbZ5G7UT1MofwYFigGebnrzGJacoBSQM0/6bi/PUMVE+qlWDD/OalvQKbwgQzU6dl0xAv6r4X7Jme0RYxA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-plugin-utils": "^7.27.1" }, @@ -1611,6 +1613,7 @@ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.27.1.tgz", "integrity": "sha512-2KH4LWGSrJIkVf5tSiBFYuXDAoWRq2MMwgivCf+93dd0GQi8RXLjKA/0EvRnVV5G0hrHczsquXuD01L8s6dmBw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/helper-annotate-as-pure": "^7.27.1", "@babel/helper-module-imports": "^7.27.1", @@ -2439,6 +2442,7 @@ "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.14.0.tgz", "integrity": "sha512-O000MLDBDdk/EohJPFUqvnp4qnHeYkVP5B0xEG0D/L7cOKP9kefu2DXn8dj74cQfsEzUqh+sr1RzFqiL1o+PpA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -2482,6 +2486,7 @@ "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.14.1.tgz", "integrity": "sha512-qEEJt42DuToa3gurlH4Qqc1kVpNq8wO8cJtDzU46TjlzWjDlsVyevtYCRijVq3SrHsROS+gVQ8Fnea108GnKzw==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.13.5", @@ -3946,6 +3951,7 @@ "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.18.0.tgz", "integrity": "sha512-bbH/HaJZpFtXGvWg3TsBWG4eyt3gah3E7nCNU8GLyRjVoWcA91Vm/T+sjHfUcwgJSw9iLtucfHBoq+qW/T30aA==", "license": "MIT", + "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/core-downloads-tracker": "^5.18.0", @@ -5152,6 +5158,7 @@ "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.26.tgz", "integrity": "sha512-RFA/bURkcKzx/X9oumPG9Vp3D3JUgus/d0b67KB0t5S/raciymilkOa66olh78MUI92QLbEJevO7rvqU/kjwKA==", "license": "MIT", + "peer": true, "dependencies": { "@types/prop-types": "*", "csstype": "^3.0.2" @@ -5303,6 +5310,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.62.0.tgz", "integrity": "sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/regexpp": "^4.4.0", "@typescript-eslint/scope-manager": "5.62.0", @@ -5356,6 +5364,7 @@ "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.62.0.tgz", "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -5725,6 +5734,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -5823,6 +5833,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -6786,6 +6797,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "baseline-browser-mapping": "^2.8.9", "caniuse-lite": "^1.0.30001746", @@ -8755,6 +8767,7 @@ "integrity": "sha512-ypowyDxpVSYpkXr9WPv2PAZCtNip1Mv5KTW0SCurXv/9iOpcrH9PaqUElksqEB6pChqHGDRCFTyrZlGhnLNGiA==", "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -11602,6 +11615,7 @@ "resolved": "https://registry.npmjs.org/jest/-/jest-27.5.1.tgz", "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -14250,6 +14264,7 @@ "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.7.tgz", "integrity": "sha512-/imKNG4EbWNrVjoNC/1H5/9GFy+tqjGBHCaSsN+P2RnPqjsLmv6UD3Ej+Kj8nBWaRAwyk7kK5ZUc+OEatnTR3A==", "license": "MIT", + "peer": true, "bin": { "jiti": "bin/jiti.js" } @@ -15676,6 +15691,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -16810,6 +16826,7 @@ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.1.2.tgz", "integrity": "sha512-Q8qQfPiZ+THO/3ZrOrO0cJJKfpYCagtMUkXbnEfmgUjwXg6z/WBeOyS9APBBPCTSiDV+s4SwQGu8yFsiMRIudg==", "license": "MIT", + "peer": true, "dependencies": { "cssesc": "^3.0.0", "util-deprecate": "^1.0.2" @@ -17175,6 +17192,7 @@ "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0" }, @@ -17325,6 +17343,7 @@ "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", "license": "MIT", + "peer": true, "dependencies": { "loose-envify": "^1.1.0", "scheduler": "^0.23.2" @@ -17350,6 +17369,7 @@ "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz", "integrity": "sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A==", "license": "MIT", + "peer": true, "engines": { "node": ">=0.10.0" } @@ -17885,6 +17905,7 @@ "resolved": "https://registry.npmjs.org/rollup/-/rollup-2.79.2.tgz", "integrity": "sha512-fS6iqSPZDs3dr/y7Od6y5nha8dW1YnbgtsyotCVvoFGKbERG++CVRFv1meyGDE1SNItQA8BrnCw7ScdAhRJ3XQ==", "license": "MIT", + "peer": true, "bin": { "rollup": "dist/bin/rollup" }, @@ -18183,6 +18204,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -19868,6 +19890,7 @@ "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", "license": "(MIT OR CC0-1.0)", + "peer": true, "engines": { "node": ">=10" }, @@ -20300,6 +20323,7 @@ "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.102.1.tgz", "integrity": "sha512-7h/weGm9d/ywQ6qzJ+Xy+r9n/3qgp/thalBbpOi5i223dPXKi04IBtqPN9nTd+jBc7QKfvDbaBnFipYp4sJAUQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/eslint-scope": "^3.7.7", "@types/estree": "^1.0.8", @@ -20371,6 +20395,7 @@ "resolved": "https://registry.npmjs.org/webpack-dev-server/-/webpack-dev-server-4.15.2.tgz", "integrity": "sha512-0XavAZbNJ5sDrCbkpWL8mia0o5WPOd2YGtxrEiZkBK9FjLppIUK2TgxK6qGD2P3hUXTJNNPVibrerKcx5WkR1g==", "license": "MIT", + "peer": true, "dependencies": { "@types/bonjour": "^3.5.9", "@types/connect-history-api-fallback": "^1.3.5", @@ -20783,6 +20808,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.17.1.tgz", "integrity": "sha512-B/gBuNg5SiMTrPkC+A2+cW0RszwxYmn6VYxB/inlBStS5nx6xHIt/ehKRhIMhqusl7a8LjQoZnjCs5vhwxOQ1g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.3", "fast-uri": "^3.0.1", @@ -21172,7 +21198,6 @@ "resolved": "https://registry.npmjs.org/zrender/-/zrender-5.6.1.tgz", "integrity": "sha512-OFXkDJKcrlx5su2XbzJvj/34Q3m6PvyCZkVPHGYpcCJ52ek4U/ymZyfuV1nKE23AyBJ51E/6Yr0mhZ7xGTO4ag==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "tslib": "2.3.0" } diff --git a/client/package.json b/client/package.json index 9c5ea84..bee0177 100644 --- a/client/package.json +++ b/client/package.json @@ -45,5 +45,5 @@ "last 1 safari version" ] }, - "proxy": "http://localhost:5000" + "proxy": "http://localhost:5001" } diff --git a/client/src/api/orientation.js b/client/src/api/orientation.js index f1f3365..0931821 100644 --- a/client/src/api/orientation.js +++ b/client/src/api/orientation.js @@ -15,7 +15,6 @@ const queryMagFieldData = async (start, end) => { ); const responses = await Promise.all(requests); - const magFieldDataArray = []; return responses.map((magfieldData) => magfieldData.map(item => [item.variant, item.timestamp, item.X, item.Y, item.Z]), @@ -23,8 +22,32 @@ const queryMagFieldData = async (start, end) => { ); } +const queryAngFieldData = async (start, end) => { + let endpoint = `adcs/angv` + + const params = new URLSearchParams({start: dateToRFC(start), end: dateToRFC(end)}) + + const requests = Array.from({ length: NUMBER_OF_VARIANTS }, (_, i) => + fetchData(`${endpoint}/${i + 1}?${params.toString()}`), + ); + + const responses = await Promise.all(requests); + + return responses.map((angFieldData) => + angFieldData.map(item => [item.variant, item.timestamp, item.X, item.Y, item.Z]), + console.log(responses.length) + ); +} + + export const fetchMagneticField = async (start, end) => { const magnetic = await queryMagFieldData(start, end); return { magnetic }; }; + +export const fetchAngVelData = async (start, end) => { + + const angvel = await queryAngFieldData(start, end); + return { angvel }; +}; diff --git a/client/src/pages/OrientationTab.js b/client/src/pages/OrientationTab.js index 7db09d6..9923085 100644 --- a/client/src/pages/OrientationTab.js +++ b/client/src/pages/OrientationTab.js @@ -1,6 +1,7 @@ import React, { useState, useEffect } from 'react'; import { useQuery } from '@tanstack/react-query'; import { fetchMagneticField, fetchMagField } from '../api/orientation.js'; +import { fetchAngVelData } from '../api/orientation.js'; import Box from '@mui/material/Box'; import FormControlLabel from '@mui/material/FormControlLabel'; import Switch from '@mui/material/Switch'; @@ -10,92 +11,206 @@ import { testTemperatureData, testLuminosityData, testWellActivity } from '../ap const CHART_WIDTH = 800; -let magDataArray = []; - const chartSize = { width: CHART_WIDTH, height: 400 } +const formatTime = (isoString) => { + return new Intl.DateTimeFormat("en-CA", { + year: "numeric", + month: "short", + day: "2-digit", + hour: "2-digit", + minute: "2-digit", + timeZone: "UTC", + }).format(new Date(isoString)); +}; + export default function OrientationTab() { const { timeRange } = useTimeContext(); + + // mag field data const [magneticData, setMagneticData] = useState([]); - let magVariant = []; - let magTime = []; - let magX = []; - let magY = []; - let magZ = []; + const [magVariants, setMagVariants] = useState([]); + const [magTime, setMagTime] = useState([]); + const [magX, setMagX] = useState([]); + const [magY, setMagY] = useState([]); + const [magZ, setMagZ] = useState([]); + + // angular velocity data + const [angVelData, setAngVelData] = useState([]); + const [angVelVariants, setAngVelVariants] = useState([]); + const [angVelTime, setAngVelTime] = useState([]); + const [angVelX, setAngVelX] = useState([]); + const [angVelY, setAngVelY] = useState([]); + const [angVelZ, setAngVelZ] = useState([]); useEffect(() => { const load = async () => { const start = new Date('2025-09-01T00:00:00Z'); const end = new Date('2025-09-10T00:00:00Z'); + const initialmagvariants = []; + const initialmagtimes = []; + const initialmagx = []; + const initialmagy = []; + const initialmagz = []; + + const initialAngVelVariants = []; + const initialAngVelTimes = []; + const initialAngVelX = []; + const initialAngVelY = []; + const initialAngVelZ = []; + const { magnetic } = await fetchMagneticField(start, end); - console.log('fetchMagneticField result:', magnetic); - console.log('fetchMagneticField array 1 result: ', magnetic[0]) - console.log('fetchMagneticField array x result: ', magnetic[0][0][0]) + const { angvel } = await fetchAngVelData(start, end); // variant -> timestamp -> X -> Y -> Z for (let i = 0; i < magnetic.length; i++) { for (let j = 0; j < magnetic[i].length; j++) { - const value = magnetic[i][j]; - console.log('magvariant size: ', magVariant.length); - magVariant.push(magnetic[i][j][0]); - magTime.push(magnetic[i][j][1]); - magX.push(magnetic[i][j][2]); - magY.push(magnetic[i][j][3]); - magZ.push(magnetic[i][j][4]); + console.log(magnetic[0].length); + + if (magnetic[i][j][0] === '1') { initialmagvariants.push("Primary"); } + else if (magnetic[i][j][0] === '2') { initialmagvariants.push("Backup"); } + initialmagtimes.push(magnetic[i][j][1]); + initialmagx.push(magnetic[i][j][2]); + initialmagy.push(magnetic[i][j][3]); + initialmagz.push(magnetic[i][j][4]); } } - - setMagneticData(magnetic); - console.log('magneticData size: ', magneticData.length) - for (let i = 0; i < magneticData.length; i++) { - for (let j = 0; j < magneticData[i].length; j++) { - magDataArray.push(magneticData[i][j]); - } + for (let i = 0; i < angvel.length; i++) { + for (let j = 0; j < angvel[i].length; j++) { + console.log(angvel[0].length); - console.log('magData Length: ', magDataArray.length) + if (angvel[i][j][0] === '1') { initialAngVelVariants.push("Primary"); } + else if (angvel[i][j][0] === '2') { initialAngVelVariants.push("Backup"); } + initialAngVelTimes.push(angvel[i][j][1]); + initialAngVelX.push(angvel[i][j][2]); + initialAngVelY.push(angvel[i][j][3]); + initialAngVelZ.push(angvel[i][j][4]); + } } - for (let i = 0; i < magDataArray.length; i++) { - console.log('mag data array: ', magDataArray[i]) - } + setMagVariants(initialmagvariants); + setMagTime(initialmagtimes); + setMagX(initialmagx); + setMagY(initialmagy); + setMagZ(initialmagz); + + setAngVelVariants(initialAngVelVariants); + setAngVelTime(initialAngVelTimes); + setAngVelX(initialAngVelX); + setAngVelY(initialAngVelY); + setAngVelZ(initialAngVelZ); + + setMagneticData(magnetic); + setAngVelData(angvel); } load().catch(console.error); }, []); - const displayMagneticFieldData = () => { - for (let i = 0; i <= magDataArray.length; i++) { - for (let j = 0; j <= magDataArray[i]; j++) - { - console.log('here ', magDataArray[i][0]) - return magDataArray[i][j]; - } - } - }; - // WORK IN PROGRESS return ( -
- Magnetic Field Data -
-

- VARIANT: - {magneticData[1][1]} -

+
+
+ Magnetic Field Data (uT) +
+
+ Angular Velocity Data (deg/s) +
+
+
+
+

+ VARIANT: + { + magVariants.map((variant, index) => ( +

{variant}

+ )) + } +

+

+ Time: + { + magTime.map((time, index) => ( +

{formatTime(time)}

+ )) + } +

+

+ X: + { + magX.map((x, index) => ( +

{x}

+ )) + } +

+

+ Y: + { + magY.map((y, index) => ( +

{y}

+ )) + } +

+

+ Z: + { + magZ.map((z, index) => ( +

{z}

+ )) + } +

+
+
+

+ VARIANT: + { + angVelVariants.map((variant, index) => ( +

{variant}

+ )) + } +

+

+ Time: + { + angVelTime.map((time, index) => ( +

{formatTime(time)}

+ )) + } +

+

+ X: + { + angVelX.map((x, index) => ( +

{x}

+ )) + } +

+

+ Y: + { + angVelY.map((y, index) => ( +

{y}

+ )) + } +

+

+ Z: + { + angVelZ.map((z, index) => ( +

{z}

+ )) + } +

+
+
- Data - {magneticData.length === 0 ? ( -

No Data

- ) : ( -
{JSON.stringify(magneticData, null, 2)}
- )}
diff --git a/server/Dockerfile b/server/Dockerfile index 841527e..baa16ac 100644 --- a/server/Dockerfile +++ b/server/Dockerfile @@ -8,6 +8,6 @@ RUN npm install COPY . . -EXPOSE 5000 +EXPOSE 5001 CMD ["npm", "start"] \ No newline at end of file diff --git a/server/config/env.js b/server/config/env.js index 63ed10e..42d985b 100644 --- a/server/config/env.js +++ b/server/config/env.js @@ -9,7 +9,7 @@ const db_password = process.env.DB_PASS; const db_adminToken = process.env.DB_TOKEN; const db_bucket = process.env.DB_BUCKET; const db_org = process.env.DB_ORG; -const api_port = 5000; +const api_port = 5001; // port 5000 is used by macOS if(!db_url){ console.error('DB_URL is not set'); diff --git a/server/docker-compose.yaml b/server/docker-compose.yaml index f245b04..bb19bee 100644 --- a/server/docker-compose.yaml +++ b/server/docker-compose.yaml @@ -5,7 +5,7 @@ services: build: context: . ports: - - "5000:5000" + - "5001:5001" links: - influxdb depends_on: diff --git a/server/package-lock.json b/server/package-lock.json index 31f5ff2..6423158 100644 --- a/server/package-lock.json +++ b/server/package-lock.json @@ -11,7 +11,7 @@ "dependencies": { "@influxdata/influxdb-client": "^1.35.0", "@influxdata/influxdb-client-apis": "^1.35.0", - "express": "^4.19.2" + "express": "^4.22.1" }, "devDependencies": { "@eslint/js": "^9.21.0", @@ -859,38 +859,39 @@ } }, "node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", + "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -916,6 +917,21 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/express/node_modules/qs": { + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.1.0" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/fast-deep-equal": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", diff --git a/server/package.json b/server/package.json index fd720cb..9c6b119 100644 --- a/server/package.json +++ b/server/package.json @@ -12,7 +12,7 @@ "dependencies": { "@influxdata/influxdb-client": "^1.35.0", "@influxdata/influxdb-client-apis": "^1.35.0", - "express": "^4.19.2" + "express": "^4.22.1" }, "devDependencies": { "@eslint/js": "^9.21.0", From 2827c90f652d223529af6d238a8281caaee2e304 Mon Sep 17 00:00:00 2001 From: Anton Frank Date: Thu, 29 Jan 2026 16:50:50 -0600 Subject: [PATCH 4/5] Add LSB data --- client/src/api/orientation.js | 6 ++---- client/src/pages/OrientationTab.js | 24 +++++++++++++++++------- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/client/src/api/orientation.js b/client/src/api/orientation.js index 0931821..b40edb6 100644 --- a/client/src/api/orientation.js +++ b/client/src/api/orientation.js @@ -17,8 +17,7 @@ const queryMagFieldData = async (start, end) => { const responses = await Promise.all(requests); return responses.map((magfieldData) => - magfieldData.map(item => [item.variant, item.timestamp, item.X, item.Y, item.Z]), - console.log(responses.length) + magfieldData.map(item => [item.variant, item.timestamp, item.LSB, item.X, item.Y, item.Z]) ); } @@ -34,8 +33,7 @@ const queryAngFieldData = async (start, end) => { const responses = await Promise.all(requests); return responses.map((angFieldData) => - angFieldData.map(item => [item.variant, item.timestamp, item.X, item.Y, item.Z]), - console.log(responses.length) + angFieldData.map(item => [item.variant, item.timestamp, item.X, item.Y, item.Z]) ); } diff --git a/client/src/pages/OrientationTab.js b/client/src/pages/OrientationTab.js index 9923085..e0e309c 100644 --- a/client/src/pages/OrientationTab.js +++ b/client/src/pages/OrientationTab.js @@ -33,6 +33,7 @@ export default function OrientationTab() { // mag field data const [magneticData, setMagneticData] = useState([]); const [magVariants, setMagVariants] = useState([]); + const [magLSB, setMagLSB] = useState([]); const [magTime, setMagTime] = useState([]); const [magX, setMagX] = useState([]); const [magY, setMagY] = useState([]); @@ -52,6 +53,7 @@ export default function OrientationTab() { const end = new Date('2025-09-10T00:00:00Z'); const initialmagvariants = []; + const initialmaglsb = []; const initialmagtimes = []; const initialmagx = []; const initialmagy = []; @@ -69,21 +71,19 @@ export default function OrientationTab() { // variant -> timestamp -> X -> Y -> Z for (let i = 0; i < magnetic.length; i++) { for (let j = 0; j < magnetic[i].length; j++) { - console.log(magnetic[0].length); - if (magnetic[i][j][0] === '1') { initialmagvariants.push("Primary"); } else if (magnetic[i][j][0] === '2') { initialmagvariants.push("Backup"); } + initialmaglsb.push(magnetic[i][j][2]); + console.log(magnetic[i][j][2]); initialmagtimes.push(magnetic[i][j][1]); - initialmagx.push(magnetic[i][j][2]); - initialmagy.push(magnetic[i][j][3]); - initialmagz.push(magnetic[i][j][4]); + initialmagx.push(magnetic[i][j][3]); + initialmagy.push(magnetic[i][j][4]); + initialmagz.push(magnetic[i][j][5]); } } for (let i = 0; i < angvel.length; i++) { for (let j = 0; j < angvel[i].length; j++) { - console.log(angvel[0].length); - if (angvel[i][j][0] === '1') { initialAngVelVariants.push("Primary"); } else if (angvel[i][j][0] === '2') { initialAngVelVariants.push("Backup"); } initialAngVelTimes.push(angvel[i][j][1]); @@ -94,6 +94,7 @@ export default function OrientationTab() { } setMagVariants(initialmagvariants); + setMagLSB(initialmaglsb); setMagTime(initialmagtimes); setMagX(initialmagx); setMagY(initialmagy); @@ -133,6 +134,14 @@ export default function OrientationTab() {

{variant}

)) } +

+

+ LSB {magLSB.length}: + { + magLSB.map((lsb, index) => ( +

{String(lsb)}

+ )) + }

Time: @@ -167,6 +176,7 @@ export default function OrientationTab() { }

+

VARIANT: From ef43576120f10992d583d07ab254c1abc15b147b Mon Sep 17 00:00:00 2001 From: Anton Frank <73040360+ApplePy39@users.noreply.github.com> Date: Thu, 29 Jan 2026 16:57:44 -0600 Subject: [PATCH 5/5] Update OrientationTab.js --- client/src/pages/OrientationTab.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/src/pages/OrientationTab.js b/client/src/pages/OrientationTab.js index e0e309c..3f68e81 100644 --- a/client/src/pages/OrientationTab.js +++ b/client/src/pages/OrientationTab.js @@ -136,7 +136,7 @@ export default function OrientationTab() { }

- LSB {magLSB.length}: + LSB: { magLSB.map((lsb, index) => (

{String(lsb)}

@@ -225,4 +225,4 @@ export default function OrientationTab() { ); -} \ No newline at end of file +}