From d6c670fb78ed966023bad65eae2c2d186c666fb8 Mon Sep 17 00:00:00 2001 From: csawatzky Date: Fri, 12 Dec 2025 15:17:37 -0600 Subject: [PATCH 01/30] updated the grain describers to use the new enum in the pond for the moisture calculation, changed the extract moisture function to account for custom grain types, and if there is no equation set it will return the humidity, updated instances where the bin uses that function to pass in the grain settings in its inventory --- package-lock.json | 4 +- package.json | 2 +- src/bin/BinCardV2.tsx | 1 + src/bin/BinConditioningCard.tsx | 4 +- src/bin/BinConditioningInteraction.tsx | 9 +- src/bin/BinSVGV2.tsx | 6 +- src/bin/BinSettings.tsx | 84 ++++---- src/bin/BinVisualizerV2.tsx | 63 +++--- src/bin/graphs/BinGraphsTrending.tsx | 3 +- src/grain/CustomGrainForm.tsx | 286 +++++++++++++++++++++++++ src/grain/GrainDescriber.ts | 79 +++---- src/grain/GrainMoisture.ts | 58 +++-- src/models/Bin.ts | 4 + src/pages/Bin.tsx | 2 + src/providers/pond/grainAPI.tsx | 123 +++++++++++ src/providers/pond/pond.tsx | 8 +- 16 files changed, 596 insertions(+), 140 deletions(-) create mode 100644 src/grain/CustomGrainForm.tsx create mode 100644 src/providers/pond/grainAPI.tsx diff --git a/package-lock.json b/package-lock.json index abf6c85..ccaf96a 100644 --- a/package-lock.json +++ b/package-lock.json @@ -42,7 +42,7 @@ "mui-tel-input": "^7.0.0", "notistack": "^3.0.1", "openweathermap-ts": "^1.2.10", - "protobuf-ts": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#master", + "protobuf-ts": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#custom_grain", "query-string": "^9.2.1", "react": "^18.3.1", "react-beautiful-dnd": "^13.1.1", @@ -10953,7 +10953,7 @@ }, "node_modules/protobuf-ts": { "version": "1.0.0", - "resolved": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#c08965a296f2cd0799472fd8b163186cf6885d4c", + "resolved": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#e926a3b73f9b6a1b4f9e6f520628a905f7f0fb25", "dependencies": { "protobufjs": "^6.8.8" } diff --git a/package.json b/package.json index ee0e9b7..98d4519 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "mui-tel-input": "^7.0.0", "notistack": "^3.0.1", "openweathermap-ts": "^1.2.10", - "protobuf-ts": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#master", + "protobuf-ts": "git+https://gitlab+deploy-token-50627:hv8mB4WkyvtjBpJKU1rN@gitlab.com/brandx/protobuf-ts.git#custom_grain", "query-string": "^9.2.1", "react": "^18.3.1", "react-beautiful-dnd": "^13.1.1", diff --git a/src/bin/BinCardV2.tsx b/src/bin/BinCardV2.tsx index a4afc33..3084edc 100644 --- a/src/bin/BinCardV2.tsx +++ b/src/bin/BinCardV2.tsx @@ -417,6 +417,7 @@ export default function BinCard(props: Props) { hottestNodeTemp={valDisplay === "high" ? hotNode?.temp : undefined} coldestNodeTemp={valDisplay === "low" ? coldNode?.temp : undefined} inventoryControl={bin.inventoryControl()} + customGrain={bin.customGrain()} /> diff --git a/src/bin/BinConditioningCard.tsx b/src/bin/BinConditioningCard.tsx index cf3b3aa..8caac52 100644 --- a/src/bin/BinConditioningCard.tsx +++ b/src/bin/BinConditioningCard.tsx @@ -39,11 +39,12 @@ interface Props { heaters?: Controller[]; fans?: Controller[]; grain?: pond.Grain; + customGrain?: pond.GrainSettings } export default function BinConditioningCard(props: Props) { const classes = useStyles(); - const { interactions, interactionDevices, plenums, ambients, heaters, fans, grain, mode } = props; + const { interactions, interactionDevices, plenums, ambients, heaters, fans, grain, mode, customGrain } = props; const [sourceMap, setSourceMap] = useState>(new Map()); const [sinkMap, setSinkMap] = useState>(new Map()); @@ -87,6 +88,7 @@ export default function BinConditioningCard(props: Props) { sink={sink} source={source} grain={grain} + customGrain={customGrain} /> ); } diff --git a/src/bin/BinConditioningInteraction.tsx b/src/bin/BinConditioningInteraction.tsx index 7fe8bea..bd6c3c7 100644 --- a/src/bin/BinConditioningInteraction.tsx +++ b/src/bin/BinConditioningInteraction.tsx @@ -84,10 +84,11 @@ interface Props { source: Component; sink: Component; grain?: pond.Grain; + customGrain?: pond.GrainSettings } export default function BinConditioningInteraction(props: Props) { - const { interaction, source, sink, grain, deviceId } = props; + const { interaction, source, sink, grain, deviceId, customGrain } = props; const [sliderVals, setSliderVals] = useState>(new Map()); const [sliderMarks, setSliderMarks] = useState>(new Map()); //this is the emc value calculated from the interactions temp and humidity conditions @@ -127,7 +128,6 @@ export default function BinConditioningInteraction(props: Props) { if ( grain !== undefined && grain !== pond.Grain.GRAIN_INVALID && - grain !== pond.Grain.GRAIN_CUSTOM && temp && hum ) { @@ -135,8 +135,9 @@ export default function BinConditioningInteraction(props: Props) { //the emc calc needs the temp to be in celsius temp = fahrenheitToCelsius(temp); } - let emc = ExtractMoisture(grain, temp, hum); - setBaseEMC(emc); + let emc = ExtractMoisture(grain, temp, hum, customGrain) + setBaseEMC(emc === hum ? undefined : emc); + } }, [sliderVals, grain]); diff --git a/src/bin/BinSVGV2.tsx b/src/bin/BinSVGV2.tsx index f3c3454..ecbeb53 100644 --- a/src/bin/BinSVGV2.tsx +++ b/src/bin/BinSVGV2.tsx @@ -147,6 +147,7 @@ interface Props { hottestNodeTemp?: number; coldestNodeTemp?: number; inventoryControl?: pond.BinInventoryControl; + customGrain?: pond.GrainSettings; } interface GrainNodePoint { @@ -211,7 +212,8 @@ export default function BinSVGV2(props: Props) { hottestNodeTemp, coldestNodeTemp, inventoryControl, - co2Sensors + co2Sensors, + customGrain } = props; const [{ user }] = useGlobalState(); const [extraDetails, setExtraDetails] = useState<"temps" | "hums">("temps"); @@ -683,7 +685,7 @@ export default function BinSVGV2(props: Props) { x: cablePos, y: nodeY + 10, stroke: "green", - value: ExtractMoisture(props.grainType, temp, cable.humidities[index] ?? 0).toFixed(1)+"%", + value: ExtractMoisture(props.grainType, temp, cable.humidities[index] ?? 0, customGrain).toFixed(1)+"%", }) !showTempHum && nodeClickData.push({ diff --git a/src/bin/BinSettings.tsx b/src/bin/BinSettings.tsx index 61389f9..09487d9 100644 --- a/src/bin/BinSettings.tsx +++ b/src/bin/BinSettings.tsx @@ -65,6 +65,7 @@ import { getDistanceUnit, or, getTemperatureUnit, getGrainUnit } from "utils"; import { makeStyles } from "@mui/styles"; import { useNavigate } from "react-router-dom"; import BinSelector from "./BinSelector"; +import CustomGrainForm from "grain/CustomGrainForm"; // import BinSelector from "./BinSelector"; const useStyles = makeStyles((theme: Theme) => { @@ -205,6 +206,7 @@ export default function BinSettings(props: Props) { const libracartAPI = useLibraCartProxyAPI() const [lcDestination, setlcDestination] = useState