refactor programmable modules

This commit is contained in:
h z
2024-07-06 02:12:54 +01:00
parent be5428d708
commit 3eec8a1345
26 changed files with 329 additions and 364 deletions

View File

@@ -0,0 +1,111 @@
using Enigmos.Boards;
using Enigmos.Modules.InterlayerModules;
using Godot;
using Nocturnis.DataStructures.DataPortGroups;
using Nocturnis.Enigmos.Modules;
using Nocturnis.Enigmos.Ports;
using Nocturnis.Enigmos.Ports.DataPorts;
using Nocturnis.GlobalManagement.Constants;
using Nocturnis.GlobalManagement.Providers;
namespace Enigmos.Modules.ProgrammableModules.FunctionModule;
public partial class FunctionModule : ProgrammableModule, IPolymorphismModule
{
private IDataPortGroup[] ExteriorToInterior { get; set; } = Array.Empty<IDataPortGroup>();
private IDataPortGroup[] InteriorToExterior { get; set; } = Array.Empty<IDataPortGroup>();
public void Inference(){}
public HashSet<IDataPortGroup> ConfigurablePortGroups { get; set; } = new();
public override IEnumerable<IBasePort> ExplicitPorts =>
ExplicitDataInModules
.SelectMany(module => module.Ports)
.Union(ExplicitDataOutModules.SelectMany(module => module.Ports))
.Union(ExplicitSignalInModules.SelectMany(module => module.Ports))
.Union(ExplicitSignalOutModules.SelectMany(module => module.Ports));
public override IEnumerable<IBasePort> ImplicitPorts =>
UnderlyingBoard.DataIns
.SelectMany(module => module.Ports)
.Union(UnderlyingBoard.DataOuts.SelectMany(module => module.Ports))
.Union(UnderlyingBoard.SignalIns.SelectMany(module => module.Ports))
.Union(UnderlyingBoard.SignalOuts.SelectMany(module => module.Ports));
private static readonly PackedScene FunctionModuleBoardScene = GlobalProvider.SceneProvider!
.AssetMapper<FunctionModuleBoard>();
public override BaseModule[] SubModules =>
ExplicitDataInModules
.Union<BaseModule>(ExplicitDataOutModules)
.Union(ExplicitSignalInModules)
.Union(ExplicitSignalOutModules)
.ToArray();
private InterlayerDataInModule[] ExplicitDataInModules { get; set; } = Array.Empty<InterlayerDataInModule>();
private InterlayerDataOutModule[] ExplicitDataOutModules { get; set; } = Array.Empty<InterlayerDataOutModule>();
private InterlayerSignalInModule[] ExplicitSignalInModules { get; set; } = Array.Empty<InterlayerSignalInModule>();
private InterlayerSignalOutModule[] ExplicitSignalOutModules { get; set; } =
Array.Empty<InterlayerSignalOutModule>();
protected new FunctionModuleBoard UnderlyingBoard
{
get => (base.UnderlyingBoard as FunctionModuleBoard)!;
set => base.UnderlyingBoard = value;
}
public override void Init()
{
UnderlyingBoard = FunctionModuleBoardScene.Instantiate<FunctionModuleBoard>();
UnderlyingBoard.Init();
ExteriorToInterior = new IDataPortGroup[4];
InteriorToExterior = new IDataPortGroup[4];
ExplicitDataInModules = new InterlayerDataInModule[4];
ExplicitDataOutModules = new InterlayerDataOutModule[4];
ExplicitSignalInModules = new InterlayerSignalInModule[4];
ExplicitSignalOutModules = new InterlayerSignalOutModule[4];
for (int i = 0; i < 4; i++)
{
ExplicitDataInModules[i] = GetModule<InterlayerDataInModule>($"EI{i + 1}");
ExplicitDataOutModules[i] = GetModule<InterlayerDataOutModule>($"EO{i + 1}");
ExplicitSignalInModules[i] = GetModule<InterlayerSignalInModule>($"ESI{i + 1}");
ExplicitSignalOutModules[i] = GetModule<InterlayerSignalOutModule>($"ESO{i + 1}");
ExplicitDataInModules[i].DualModule = UnderlyingBoard.DataOuts[i];
ExplicitDataOutModules[i].DualModule = UnderlyingBoard.DataIns[i];
ExplicitSignalInModules[i].DualModule = UnderlyingBoard.SignalOuts[i];
ExplicitSignalOutModules[i].DualModule = UnderlyingBoard.SignalIns[i];
UnderlyingBoard.DataOuts[i].DualModule = ExplicitDataInModules[i];
UnderlyingBoard.DataIns[i].DualModule = ExplicitDataOutModules[i];
UnderlyingBoard.SignalOuts[i].DualModule = ExplicitSignalInModules[i];
UnderlyingBoard.SignalIns[i].DualModule = ExplicitSignalOutModules[i];
}
for (int i = 0; i < 4; i++)
{
ExteriorToInterior[i] = GlobalProvider.DataStructureProvider!.NewDataPortGroup(
this,
new IDataPort[] { ExplicitDataInModules[i].DataIn, UnderlyingBoard.DataOuts[i].DataOut },
$"Exterior In -> Interior Out{i + 1}",
EnigmosConstant.DataPortTypes.Real,
EnigmosConstant.DataPortTypes.AnyType
);
InteriorToExterior[i] = GlobalProvider.DataStructureProvider.NewDataPortGroup(
this,
new IDataPort[] { UnderlyingBoard.DataIns[i].DataIn, ExplicitDataOutModules[i].DataOut },
$"Interior In -> Exterior Out{i + 1}",
EnigmosConstant.DataPortTypes.Real,
EnigmosConstant.DataPortTypes.AnyType
);
}
ConfigurablePortGroups = ExteriorToInterior.Union(InteriorToExterior).ToHashSet();
PostInit();
}
}