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(); private IDataPortGroup[] InteriorToExterior { get; set; } = Array.Empty(); public void Inference(){} public HashSet ConfigurablePortGroups { get; set; } = new(); public override IEnumerable 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 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(); private InterlayerDataOutModule[] ExplicitDataOutModules { get; set; } = Array.Empty(); private InterlayerSignalInModule[] ExplicitSignalInModules { get; set; } = Array.Empty(); private InterlayerSignalOutModule[] ExplicitSignalOutModules { get; set; } = Array.Empty(); protected new FunctionModuleBoard UnderlyingBoard { get => (base.UnderlyingBoard as FunctionModuleBoard)!; set => base.UnderlyingBoard = value; } public override void Init() { UnderlyingBoard = GlobalProvider .AssetMapper.Scene .Instantiate(); UnderlyingBoard.Init(); ExteriorToInterior = new IDataPortGroup[4]; InteriorToExterior = new IDataPortGroup[4]; ExplicitDataInModules = GetChildren() .OfType() .OrderBy(x => x.AsNode.Name) .ToArray(); ExplicitDataOutModules = GetChildren() .OfType() .OrderBy(x => x.AsNode.Name) .ToArray(); ExplicitSignalInModules = GetChildren() .OfType() .OrderBy(x => x.AsNode.Name) .ToArray(); ExplicitSignalOutModules = GetChildren() .OfType() .OrderBy(x => x.AsNode.Name) .ToArray(); for (int i = 0; i < 4; i++) { ExplicitDataInModules[i] = GetModule($"EI{i + 1}"); ExplicitDataOutModules[i] = GetModule($"EO{i + 1}"); ExplicitSignalInModules[i] = GetModule($"ESI{i + 1}"); ExplicitSignalOutModules[i] = GetModule($"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(); } }