187 lines
7.4 KiB
C#
187 lines
7.4 KiB
C#
using MainShell.ProcessResult;
|
|
using MainShell.Recipe.Models;
|
|
using System;
|
|
|
|
namespace MainShell.Process
|
|
{
|
|
public class AutoProductionRuntimeStateService
|
|
{
|
|
private readonly ProcessResultManager _processResultManager;
|
|
|
|
public AutoProductionRuntimeStateService(ProcessResultManager processResultManager)
|
|
{
|
|
_processResultManager = processResultManager ?? throw new ArgumentNullException(nameof(processResultManager));
|
|
}
|
|
|
|
public int CurrentSubstratePendingCount
|
|
{
|
|
get { return _processResultManager.AutoProductionRuntimeState.CurrentSubstratePendingCount; }
|
|
}
|
|
|
|
public int CurrentSubstrateProcessedCount
|
|
{
|
|
get { return _processResultManager.AutoProductionRuntimeState.CurrentSubstrateProcessedCount; }
|
|
}
|
|
|
|
public int CurrentChipRemainingCount
|
|
{
|
|
get { return _processResultManager.AutoProductionRuntimeState.CurrentChipRemainingCount; }
|
|
}
|
|
|
|
public bool TransferNeedsRecheck
|
|
{
|
|
get { return _processResultManager.AutoProductionRuntimeState.TransferNeedsRecheck; }
|
|
}
|
|
|
|
public bool TransferChipExhausted
|
|
{
|
|
get { return _processResultManager.AutoProductionRuntimeState.TransferChipExhausted; }
|
|
}
|
|
|
|
public void PrepareForRun(RecipeManager recipeManager, CurrentChipLifecycleState currentChipState, bool isResume)
|
|
{
|
|
if (isResume)
|
|
{
|
|
return;
|
|
}
|
|
|
|
int defaultSubstrateTargetCount = ResolveDefaultSubstrateTargetCount(recipeManager);
|
|
AutoProductionRuntimeState runtimeState = CloneState();
|
|
|
|
runtimeState.CurrentSubstratePendingCount = Math.Max(0, defaultSubstrateTargetCount);
|
|
runtimeState.CurrentSubstrateProcessedCount = 0;
|
|
|
|
if (currentChipState == CurrentChipLifecycleState.Empty)
|
|
{
|
|
runtimeState.CurrentChipRemainingCount = 0;
|
|
}
|
|
else
|
|
{
|
|
runtimeState.CurrentChipRemainingCount = 1;
|
|
}
|
|
|
|
runtimeState.TransferNeedsRecheck = false;
|
|
runtimeState.TransferChipExhausted = false;
|
|
runtimeState.LastUpdatedTime = DateTime.Now;
|
|
_processResultManager.DashboardState.PendingCount = runtimeState.CurrentSubstratePendingCount;
|
|
_processResultManager.DashboardState.ProcessedCount = runtimeState.CurrentSubstrateProcessedCount;
|
|
_processResultManager.SaveDashboardState();
|
|
_processResultManager.SaveAutoProductionRuntimeState(runtimeState);
|
|
}
|
|
|
|
public bool ConsumeSubstrateTarget()
|
|
{
|
|
AutoProductionRuntimeState runtimeState = CloneState();
|
|
if (runtimeState.CurrentSubstratePendingCount <= 0)
|
|
{
|
|
return true;
|
|
}
|
|
|
|
runtimeState.CurrentSubstratePendingCount = Math.Max(0, runtimeState.CurrentSubstratePendingCount - 1);
|
|
runtimeState.CurrentSubstrateProcessedCount = runtimeState.CurrentSubstrateProcessedCount + 1;
|
|
runtimeState.LastUpdatedTime = DateTime.Now;
|
|
_processResultManager.DashboardState.PendingCount = runtimeState.CurrentSubstratePendingCount;
|
|
_processResultManager.DashboardState.ProcessedCount = runtimeState.CurrentSubstrateProcessedCount;
|
|
_processResultManager.SaveDashboardState();
|
|
_processResultManager.SaveAutoProductionRuntimeState(runtimeState);
|
|
return runtimeState.CurrentSubstratePendingCount == 0;
|
|
}
|
|
|
|
public bool ConsumeCurrentChip()
|
|
{
|
|
AutoProductionRuntimeState runtimeState = CloneState();
|
|
if (runtimeState.CurrentChipRemainingCount <= 0)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
runtimeState.CurrentChipRemainingCount = Math.Max(0, runtimeState.CurrentChipRemainingCount - 1);
|
|
runtimeState.LastUpdatedTime = DateTime.Now;
|
|
_processResultManager.SaveAutoProductionRuntimeState(runtimeState);
|
|
return runtimeState.CurrentChipRemainingCount == 0;
|
|
}
|
|
|
|
public bool ConsumeTransferNeedsRecheck()
|
|
{
|
|
if (!_processResultManager.AutoProductionRuntimeState.TransferNeedsRecheck)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
AutoProductionRuntimeState runtimeState = CloneState();
|
|
runtimeState.TransferNeedsRecheck = false;
|
|
runtimeState.LastUpdatedTime = DateTime.Now;
|
|
_processResultManager.SaveAutoProductionRuntimeState(runtimeState);
|
|
return true;
|
|
}
|
|
|
|
public bool ConsumeTransferChipExhausted()
|
|
{
|
|
if (!_processResultManager.AutoProductionRuntimeState.TransferChipExhausted)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
AutoProductionRuntimeState runtimeState = CloneState();
|
|
runtimeState.TransferChipExhausted = false;
|
|
runtimeState.LastUpdatedTime = DateTime.Now;
|
|
_processResultManager.SaveAutoProductionRuntimeState(runtimeState);
|
|
return true;
|
|
}
|
|
|
|
public void SetCurrentChipRemainingCount(int remainingCount)
|
|
{
|
|
AutoProductionRuntimeState runtimeState = CloneState();
|
|
runtimeState.CurrentChipRemainingCount = Math.Max(0, remainingCount);
|
|
runtimeState.LastUpdatedTime = DateTime.Now;
|
|
_processResultManager.SaveAutoProductionRuntimeState(runtimeState);
|
|
}
|
|
|
|
public void MarkTransferNeedsRecheck()
|
|
{
|
|
AutoProductionRuntimeState runtimeState = CloneState();
|
|
runtimeState.TransferNeedsRecheck = true;
|
|
runtimeState.LastUpdatedTime = DateTime.Now;
|
|
_processResultManager.SaveAutoProductionRuntimeState(runtimeState);
|
|
}
|
|
|
|
public void MarkTransferChipExhausted()
|
|
{
|
|
AutoProductionRuntimeState runtimeState = CloneState();
|
|
runtimeState.TransferChipExhausted = true;
|
|
runtimeState.LastUpdatedTime = DateTime.Now;
|
|
_processResultManager.SaveAutoProductionRuntimeState(runtimeState);
|
|
}
|
|
|
|
private AutoProductionRuntimeState CloneState()
|
|
{
|
|
AutoProductionRuntimeState source = _processResultManager.AutoProductionRuntimeState;
|
|
return new AutoProductionRuntimeState
|
|
{
|
|
CurrentSubstratePendingCount = source.CurrentSubstratePendingCount,
|
|
CurrentSubstrateProcessedCount = source.CurrentSubstrateProcessedCount,
|
|
CurrentChipRemainingCount = source.CurrentChipRemainingCount,
|
|
TransferNeedsRecheck = source.TransferNeedsRecheck,
|
|
TransferChipExhausted = source.TransferChipExhausted,
|
|
LastUpdatedTime = source.LastUpdatedTime
|
|
};
|
|
}
|
|
|
|
private static int ResolveDefaultSubstrateTargetCount(RecipeManager recipeManager)
|
|
{
|
|
if (recipeManager == null || recipeManager.CurrentSubstrateRecipe == null || recipeManager.CurrentSubstrateRecipe.SubstrateInfo == null)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
int rowNumber = Math.Max(0, recipeManager.CurrentSubstrateRecipe.SubstrateInfo.RowNumber);
|
|
int colNumber = Math.Max(0, recipeManager.CurrentSubstrateRecipe.SubstrateInfo.ColNumber);
|
|
if (rowNumber == 0 || colNumber == 0)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
return rowNumber * colNumber;
|
|
}
|
|
}
|
|
} |