Files
Enigmos/Modules/ProgrammableModules/FunctionModule/FunctionModule.cs
2024-07-10 07:02:11 +01:00

118 lines
4.5 KiB
C#

using Enigmos.Boards;
using Enigmos.Modules.InterlayerModules;
using Godot;
using Nocturnis.DataStructures.DataPortGroups;
using Nocturnis.Enigmos.Modules;
using Nocturnis.Enigmos.Modules.InterlayerModules;
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 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 = GlobalProvider
.AssetMapper<FunctionModuleBoard>.Scene
.Instantiate<FunctionModuleBoard>();
UnderlyingBoard.Init();
ExteriorToInterior = new IDataPortGroup[4];
InteriorToExterior = new IDataPortGroup[4];
ExplicitDataInModules = GetChildren()
.OfType<InterlayerDataInModule>()
.OrderBy(x => x.AsNode.Name)
.ToArray();
ExplicitDataOutModules = GetChildren()
.OfType<InterlayerDataOutModule>()
.OrderBy(x => x.AsNode.Name)
.ToArray();
ExplicitSignalInModules = GetChildren()
.OfType<InterlayerSignalInModule>()
.OrderBy(x => x.AsNode.Name)
.ToArray();
ExplicitSignalOutModules = GetChildren()
.OfType<InterlayerSignalOutModule>()
.OrderBy(x => x.AsNode.Name)
.ToArray();
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();
}
}