Initial commit

This commit is contained in:
2026-07-03 16:31:37 +07:00
commit 899c7c637d
1939 changed files with 641750 additions and 0 deletions

View File

@@ -0,0 +1,105 @@
using RobotNet.VDA5050.Type;
using RobotNet10.RobotApp.Interfaces;
namespace RobotNet10.RobotApp.Services.Robot.Actions;
public class RobotActionProvider(Logger<RobotActionProvider> Logger, IServiceProvider ServiceProvider) : BackgroundService, IRobotActionProvider
{
public bool IsInitialized { get; private set; }
private Dictionary<ActionType, Type> Actions = [];
public RobotAction GetRobotAction(ActionType type)
{
if (!Actions.TryGetValue(type, out var actionType))
{
Logger.Error($"RobotAction not found for ActionType: {type}");
throw new InvalidOperationException($"RobotAction not found for ActionType: {type}");
}
try
{
var instance = ActivatorUtilities.CreateInstance(ServiceProvider, actionType);
if (instance is not RobotAction robotAction)
{
Logger.Error($"Type {actionType.Name} is not a RobotAction");
throw new InvalidOperationException($"Type {actionType.Name} is not a RobotAction");
}
return robotAction;
}
catch (Exception ex)
{
Logger.Error($"Error creating instance of {actionType.Name}: {ex.Message}");
throw;
}
}
private static Dictionary<ActionType, Type> DiscoverActions()
{
var actionTypes = new Dictionary<ActionType, Type>();
var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(a => a.FullName?.StartsWith("RobotNet10.RobotApp") == true);
foreach (var assembly in assemblies)
{
var types = assembly.GetTypes().Where(t => t.IsClass && !t.IsAbstract && t.IsSubclassOf(typeof(RobotAction)));
foreach (var type in types)
{
var attributes = type.GetCustomAttributes(typeof(RobotActionAttribute), false);
if (attributes.Length > 0)
{
foreach(var attribute in attributes)
{
if(attribute is RobotActionAttribute robotAttribute)
{
actionTypes[robotAttribute.ActionType] = type;
break;
}
}
}
}
}
return actionTypes;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
await Task.Yield();
try
{
Logger.Info("Initializing RobotActionProvider...");
Actions = DiscoverActions();
IsInitialized = true;
Logger.Info($"Discovered {Actions.Count} robot actions.");
}
catch (Exception ex)
{
Logger.Warning($"Failed to discover robot actions. {ex}");
throw;
}
}
public RobotAction[] GetRobotActions()
{
try
{
List<RobotAction> robotActions = [];
foreach (var actionType in Actions.Values)
{
var instance = ActivatorUtilities.CreateInstance(ServiceProvider, actionType);
if (instance is not RobotAction robotAction)
{
Logger.Error($"Type {actionType.Name} is not a RobotAction");
throw new InvalidOperationException($"Type {actionType.Name} is not a RobotAction");
}
robotActions.Add(robotAction);
}
return [.. robotActions];
}
catch (Exception ex)
{
throw new Exception ($"Error get RobotActions: {ex.Message}");
}
}
}