112 lines
2.6 KiB
C#
112 lines
2.6 KiB
C#
using System;
|
|
using System.Collections.Generic;
|
|
using System.Linq;
|
|
|
|
namespace Demo.Weld
|
|
{
|
|
public enum WeldMode
|
|
{
|
|
Spot,
|
|
Seam
|
|
}
|
|
|
|
public sealed class WeldRecipe
|
|
{
|
|
private readonly List<WeldStep> _steps = new List<WeldStep>();
|
|
|
|
public string Name {
|
|
get;
|
|
set;
|
|
}
|
|
|
|
public int RetryCount { get; set; } = 5;
|
|
|
|
public IReadOnlyList<WeldStep> Steps {
|
|
get {
|
|
return _steps;
|
|
}
|
|
}
|
|
|
|
public WeldRecipe(string name)
|
|
{
|
|
Name = name;
|
|
}
|
|
|
|
public void Add(WeldStep step)
|
|
{
|
|
if (step == null) {
|
|
throw new ArgumentNullException(nameof(step));
|
|
} else if (step.Power <= 0) {
|
|
throw new ArgumentOutOfRangeException(nameof(step));
|
|
} else {
|
|
_steps.Add(step);
|
|
}
|
|
}
|
|
|
|
public bool Run(Func<WeldStep, bool> fire)
|
|
{
|
|
for (var attempt = 0; attempt < RetryCount; attempt++) {
|
|
try {
|
|
if (_steps.All(fire)) {
|
|
return true;
|
|
}
|
|
} catch (InvalidOperationException ex) {
|
|
Log($"재시도 {attempt + 1}: {ex.Message}");
|
|
} finally {
|
|
Cool();
|
|
}
|
|
}
|
|
|
|
return false;
|
|
}
|
|
|
|
public static WeldRecipe Sample()
|
|
{
|
|
var recipe = new WeldRecipe("기본") {
|
|
RetryCount = 2
|
|
};
|
|
var steps = new[] {
|
|
new WeldStep { Power = 150, Millis = 40 },
|
|
new WeldStep { Power = 180, Millis = 55 }
|
|
};
|
|
foreach (var step in steps) {
|
|
recipe.Add(step);
|
|
}
|
|
|
|
var summary = new {
|
|
recipe.Name,
|
|
Count = steps.Length
|
|
};
|
|
Log(summary.ToString());
|
|
|
|
Action done = () => {
|
|
Log("준비 끝");
|
|
};
|
|
done();
|
|
return recipe;
|
|
}
|
|
|
|
private static void Cool()
|
|
{
|
|
switch (DateTime.Now.Second % 2) {
|
|
case 0:
|
|
Log("공랭");
|
|
break;
|
|
default:
|
|
Log("수랭");
|
|
break;
|
|
}
|
|
}
|
|
|
|
private static void Log(string text)
|
|
{
|
|
}
|
|
}
|
|
|
|
public sealed class WeldStep
|
|
{
|
|
public int Power { get; set; }
|
|
public int Millis { get; set; }
|
|
}
|
|
}
|