diff --git a/app/src/components/SimulationDashboard/components/element/ElementDesign.tsx b/app/src/components/SimulationDashboard/components/element/ElementDesign.tsx index 1475462..673c56d 100644 --- a/app/src/components/SimulationDashboard/components/element/ElementDesign.tsx +++ b/app/src/components/SimulationDashboard/components/element/ElementDesign.tsx @@ -82,9 +82,11 @@ const ElementDesign: React.FC = ({
{ + onChange={(newValue) => { + console.log("newValue: ", newValue); updateTextValue(selectedBlock, selectedElement, newValue); }} /> diff --git a/app/src/modules/simulation/analyzer/analyzer.tsx b/app/src/modules/simulation/analyzer/analyzer.tsx index bf41928..3fa8753 100644 --- a/app/src/modules/simulation/analyzer/analyzer.tsx +++ b/app/src/modules/simulation/analyzer/analyzer.tsx @@ -190,6 +190,9 @@ function Analyzer() { // Track previous actions for Machines to detect cycle completion const previousMachineActionsRef = useRef>({}); + // Track previous storage loads to detect store/retrieve operations + const previousStorageLoadsRef = useRef>({}); + // Track previous action counts for Humans to detect completion from EventManager const previousHumanCountsRef = useRef>>({}); @@ -232,6 +235,7 @@ function Analyzer() { previousAssetStatesRef.current = {}; previousArmBotActionsRef.current = {}; previousMachineActionsRef.current = {}; + previousStorageLoadsRef.current = {}; previousHumanCountsRef.current = {}; previousVehiclePhasesRef.current = {}; previousCranePhasesRef.current = {}; @@ -1475,8 +1479,8 @@ function Analyzer() { currentStatus: { isActive: storage.isActive, - state: storage.state, - currentLoad, + state: storage.state || "idle", + currentLoad: currentLoad, storageCapacity: capacity, currentMaterials: storage.currentMaterials, }, @@ -1530,7 +1534,7 @@ function Analyzer() { roi: costMetrics.roi, valueAdded: costMetrics.valueAdded, costPerUnit: totalOps > 0 ? costMetrics.totalCost / totalOps : 0, - costPerStorageHour: capacity > 0 ? costMetrics.totalCost / (capacity * (timeMetrics.totalTime / 3600)) : 0, + costPerStorageHour: capacity * timeMetrics.totalTime > 0 ? costMetrics.totalCost / (capacity * (timeMetrics.totalTime / 3600)) : 0, }, // Add energy metrics @@ -2426,6 +2430,34 @@ function Analyzer() { }); }, [machines, isPlaying]); + // Monitor Storage load changes to track store/retrieve operations + useEffect(() => { + if (!isPlaying) return; + + storageUnits.forEach((storage) => { + const previousLoad = previousStorageLoadsRef.current[storage.modelUuid] || 0; + const currentLoad = storage.currentLoad || 0; + + if (currentLoad !== previousLoad) { + if (currentLoad > previousLoad) { + // Store operation + if (!completedActionsRef.current[`${storage.modelUuid}_store`]) { + completedActionsRef.current[`${storage.modelUuid}_store`] = 0; + } + completedActionsRef.current[`${storage.modelUuid}_store`] += currentLoad - previousLoad; + } else { + // Retrieve operation + if (!completedActionsRef.current[`${storage.modelUuid}_retrieve`]) { + completedActionsRef.current[`${storage.modelUuid}_retrieve`] = 0; + } + completedActionsRef.current[`${storage.modelUuid}_retrieve`] += previousLoad - currentLoad; + } + } + + previousStorageLoadsRef.current[storage.modelUuid] = currentLoad; + }); + }, [storageUnits, isPlaying]); + // Monitor Human action changes from EventManager useEffect(() => { if (!isPlaying || !humanEventManagerRef.current) return; diff --git a/app/src/modules/simulation/storageUnit/instances/storageUnitInstance/storageUnitInstance.tsx b/app/src/modules/simulation/storageUnit/instances/storageUnitInstance/storageUnitInstance.tsx index fc4eb19..baf298e 100644 --- a/app/src/modules/simulation/storageUnit/instances/storageUnitInstance/storageUnitInstance.tsx +++ b/app/src/modules/simulation/storageUnit/instances/storageUnitInstance/storageUnitInstance.tsx @@ -5,7 +5,7 @@ import { useAnimationPlaySpeed, usePauseButtonStore, usePlayButtonStore } from " function StorageUnitInstance({ storageUnit }: Readonly<{ storageUnit: StorageUnitStatus }>) { const { storageUnitStore } = useSceneContext(); - const { storageUnits, incrementActiveTime, incrementIdleTime } = storageUnitStore(); + const { storageUnits, incrementActiveTime, incrementIdleTime, setStorageUnitActive } = storageUnitStore(); const { isPlaying } = usePlayButtonStore(); const idleTimeRef = useRef(0); @@ -18,6 +18,10 @@ function StorageUnitInstance({ storageUnit }: Readonly<{ storageUnit: StorageUni const { speed } = useAnimationPlaySpeed(); const { isPaused } = usePauseButtonStore(); + useEffect(() => { + setStorageUnitActive(storageUnit.modelUuid, isPlaying); + }, [isPlaying]); + useEffect(() => { isPausedRef.current = isPaused; }, [isPaused]);